【问题标题】:Pandas Add Column Comparison ResultPandas 添加列比较结果
【发布时间】:2018-12-17 10:56:48
【问题描述】:

如何为数据框中的每一行添加一个比较列(即lead)到我的数据框中。它应该采用列平均值(总体领先平均值)并减去其月平均值。这可以通过apply 和 lambda 使用groupby 来完成吗?

即如何创建一个额外的比较列Lead_Diff,这是行项目“每月平均读数”与其整体/列平均值的差异。以下是我的数据模型,在此先感谢。

info = {'date': ['01-18', '02-18', '03-18', '01-18','02-18','01-18','03-18'], 
        'lead': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6,0.7],
        'copper': [0.7, 0.6, 0.5, 0.4, 0.3, .2, 0.1]}

df = pd.DataFrame.from_dict(info)

【问题讨论】:

  • 为上述数据提供预期的输出。
  • 如果你想对这两个元素都这样做,也许你可以使用df.groupby(df.date.str.split('-').str[0]).transform('mean') - df.mean()之类的东西?

标签: python pandas lambda apply


【解决方案1】:

我相信你需要transform 用于新Series 中的mean 与原始DataFrame 相同大小并减去列的mean:

df['mean'] = df.groupby('date')['lead'].transform('mean') - df['lead'].mean()
print (df)
    date  lead  copper      mean
0  01-18   0.1     0.7 -0.033333
1  02-18   0.2     0.6 -0.050000
2  03-18   0.3     0.5  0.100000
3  01-18   0.4     0.4 -0.033333
4  02-18   0.5     0.3 -0.050000
5  01-18   0.6     0.2 -0.033333
6  03-18   0.7     0.1  0.100000

如果年份不重要,只需要几个月:

#changed data
info = {'date': ['01-18', '03-17', '03-18', '01-18','03-17','01-17','03-17'], 
    'lead': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6,0.7],
    'copper': [0.7, 0.6, 0.5, 0.4, 0.3, .2, 0.1]}
df = pd.DataFrame.from_dict(info)

df['date'] = pd.to_datetime(df['date'], format='%m-%y')
df['mean'] = df.groupby(df['date'].dt.month)['lead'].transform('mean') - df['lead'].mean()
print (df)
        date  lead  copper      mean
0 2018-01-01   0.1     0.7 -0.033333
1 2017-03-01   0.2     0.6  0.025000
2 2018-03-01   0.3     0.5  0.025000
3 2018-01-01   0.4     0.4 -0.033333
4 2017-03-01   0.5     0.3  0.025000
5 2017-01-01   0.6     0.2 -0.033333
6 2017-03-01   0.7     0.1  0.025000

【讨论】:

  • 感谢详细的解决方案,完美!
猜你喜欢
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多