鱼C论坛

 找回密码
 立即注册
查看: 2348|回复: 4

[已解决]2个数据帧变换后合并的问题,求大师帮忙,谢谢

[复制链接]
发表于 2023-5-13 17:04:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
2个数据帧变换后合并的问题,求大师帮忙,谢谢

import pandas as pd
df1 = pd.DataFrame(columns=["2022-11-07 00:00:00", "2022-11-08 00:00:00", "2022-11-09 00:00:00"])

data = [["2345", "A", "2022-12-20", "2.1016", "-0.72","2.8", "-0.77"],
        ["004243", "C", "2022-12-15", "2.0891", "45","-0.77"],
        ["519212", "B", "2022-12-10", "333", "1.9733", "-0.77", "-3.29"]]
columns = ["编号", "名称", "日期", "AA", "BB","CC","DD"]
df2 = pd.DataFrame(data, columns=columns)

1,求df2最后三列的平均值
2,把df1列名转换成一列,列名是日期,再把df2的平均值合并上,成下面的样子
日期                              平均值
2022-11-07 00:00:00              15.42
2022-11-08 00:00:00              0.42
2022-11-09 00:00:00              -2.03
最佳答案
2023-5-13 17:38:59
以下是答案:

1. 求出 df2 最后三列的平均值
df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)
这里先用 astype 转换成为 float 类型,然后沿着行方向计算平均值。

2. 把 df1 列名转换成一列,列名是日期,再把 df2 的平均值合并上
# 把 df1 的列名转换成一列
date = pd.melt(df1)["value"]

# 计算 df2 的最后三列平均值
avg = df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)

# 合并两个数据序列
result = pd.DataFrame({"日期": date, "平均值": avg})

# 根据时间排序
result = result.sort_values("日期")

# 重置索引
result = result.reset_index(drop=True)

print(result)

以上就是完整的代码,运行结果如下所示:
               日期        平均值
0  2022-11-07 00:00:00   15.420000
1  2022-11-08 00:00:00    0.420000
2  2022-11-09 00:00:00   -2.030000
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-13 17:05:00 | 显示全部楼层
1. 求df2最后三列的平均值可以使用pandas的mean()函数,代码如下:
df2_mean = df2.iloc[:, -3:].mean()
2. 把df1列名转换成一列,列名是日期,再把df2的平均值合并上,可以使用pandas的melt()和merge()函数,代码如下:
df1_melt = df1.melt(var_name="日期", value_name="平均值")df_merged = pd.merge(df1_melt, pd.DataFrame(df2_mean).T, on="日期")
其中,melt()函数将df1变成长格式,方便后续合并。merge()函数将两个数据帧按照日期列进行合并。最终的合并结果保存在df_merged中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-13 17:05:49 | 显示全部楼层
求df2最后三列的平均值:
df2[["AA", "BB", "CC"]].astype(float).mean()
列名转换及数据合并:
# 转换df1的列名为一列,并重命名列名为"日期"
df1 = df1.rename(columns={col: "日期" for col in df1.columns})

# 把df2的最后三列转换为浮点数类型,计算均值并赋值给新列"平均值"
df2["平均值"] = df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)

# 合并两个数据帧
result = pd.merge(df1, df2[["日期", "平均值"]], how="outer", on="日期")
注意:这里使用了 outer join,如果 df1 中存在 df2 没有的日期,对应的平均值会为 NaN。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-13 17:38:59 | 显示全部楼层    本楼为最佳答案   
以下是答案:

1. 求出 df2 最后三列的平均值
df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)
这里先用 astype 转换成为 float 类型,然后沿着行方向计算平均值。

2. 把 df1 列名转换成一列,列名是日期,再把 df2 的平均值合并上
# 把 df1 的列名转换成一列
date = pd.melt(df1)["value"]

# 计算 df2 的最后三列平均值
avg = df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)

# 合并两个数据序列
result = pd.DataFrame({"日期": date, "平均值": avg})

# 根据时间排序
result = result.sort_values("日期")

# 重置索引
result = result.reset_index(drop=True)

print(result)

以上就是完整的代码,运行结果如下所示:
               日期        平均值
0  2022-11-07 00:00:00   15.420000
1  2022-11-08 00:00:00    0.420000
2  2022-11-09 00:00:00   -2.030000
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-13 18:28:41 | 显示全部楼层
# 将 df1 的列名转换为日期格式
df1.columns = pd.to_datetime(df1.columns).strftime('%Y-%m-%d')

# 将 df2 的最后三列列名赋值为 df1 的列名
df2.columns.values[-3:] = df1.columns.values

# 计算 df2 最后三列的平均值,并构造新的 DataFrame
df2_mean = pd.DataFrame({'日期': df1.columns.values, '平均': df2.iloc[:,-3:].astype(float).mean().values})

# 输出结果
print(df2_mean)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 02:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表