鱼C论坛

 找回密码
 立即注册
查看: 3154|回复: 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 最后三列的平均值

  1. df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)
复制代码

这里先用 astype 转换成为 float 类型,然后沿着行方向计算平均值。

2. 把 df1 列名转换成一列,列名是日期,再把 df2 的平均值合并上

  1. # 把 df1 的列名转换成一列
  2. date = pd.melt(df1)["value"]

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

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

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

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

  11. print(result)
复制代码


以上就是完整的代码,运行结果如下所示:


  1.                日期        平均值
  2. 0  2022-11-07 00:00:00   15.420000
  3. 1  2022-11-08 00:00:00    0.420000
  4. 2  2022-11-09 00:00:00   -2.030000
复制代码

有用请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-13 17:05:00 | 显示全部楼层
1. 求df2最后三列的平均值可以使用pandas的mean()函数,代码如下:
  1. df2_mean = df2.iloc[:, -3:].mean()
复制代码

2. 把df1列名转换成一列,列名是日期,再把df2的平均值合并上,可以使用pandas的melt()和merge()函数,代码如下:
  1. df1_melt = df1.melt(var_name="日期", value_name="平均值")
  2. df_merged = pd.merge(df1_melt, pd.DataFrame(df2_mean).T, on="日期")
复制代码

其中,melt()函数将df1变成长格式,方便后续合并。merge()函数将两个数据帧按照日期列进行合并。最终的合并结果保存在df_merged中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-13 17:05:49 | 显示全部楼层
求df2最后三列的平均值:
  1. df2[["AA", "BB", "CC"]].astype(float).mean()
复制代码

列名转换及数据合并:
  1. # 转换df1的列名为一列,并重命名列名为"日期"
  2. df1 = df1.rename(columns={col: "日期" for col in df1.columns})

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

  5. # 合并两个数据帧
  6. result = pd.merge(df1, df2[["日期", "平均值"]], how="outer", on="日期")
复制代码

注意:这里使用了 outer join,如果 df1 中存在 df2 没有的日期,对应的平均值会为 NaN。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

1. 求出 df2 最后三列的平均值

  1. df2[["AA", "BB", "CC"]].astype(float).mean(axis=1)
复制代码

这里先用 astype 转换成为 float 类型,然后沿着行方向计算平均值。

2. 把 df1 列名转换成一列,列名是日期,再把 df2 的平均值合并上

  1. # 把 df1 的列名转换成一列
  2. date = pd.melt(df1)["value"]

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

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

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

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

  11. print(result)
复制代码


以上就是完整的代码,运行结果如下所示:


  1.                日期        平均值
  2. 0  2022-11-07 00:00:00   15.420000
  3. 1  2022-11-08 00:00:00    0.420000
  4. 2  2022-11-09 00:00:00   -2.030000
复制代码

有用请设置最佳答案
小甲鱼最新课程 -> https://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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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