在 pandas 中的 groupby 之后对数据帧变量执行数学运算并将结果返回到原始数据帧

performing math on dataframe variables after groupby in pandas and bringing results back to original dataframe

首先是数据:

df
   City   Date     Sex  Weight
0    A  6/12/2015   M     185
1    A  6/12/2015   F     120
2    A  7/12/2015   M     210
3    A  7/12/2015   F     105
4    B  6/12/2015   M     225
5    B  6/12/2015   F     155
6    B  6/19/2015   M     167
7    B  6/19/2015   F     121

我正在尝试减去两个权重,男性-女性。我能够对数据进行分组并 select 每种性别的权重,但无法简单地创建一个新变量 "wt_diff" 并让 "wt_diff" 出现在每一行上,而不管性别如何,以便每个city/date/sex 组实际上在同一行中具有性别之间的体重差异。

我希望得到这个输出:

df_new
City   Date     Sex  Weight     Wt_Diff
0    A  6/12/2015   M     185     65
1    A  6/12/2015   F     120     65
2    A  7/12/2015   M     210    105
3    A  7/12/2015   F     105    105
4    B  6/12/2015   M     225     70
5    B  6/12/2015   F     155     70
6    B  6/19/2015   M     167     46
7    B  6/19/2015   F     121     46

我可以用这个得到重量差异:

def diffw(df):
return(np.diff(df.Weight)*-1)

gb = ['Date', 'City']
gb=df.groupby(gb).apply(diffw)

gb

Date       City
6/12/2015  A        [65]
           B        [70]
6/19/2015  B        [46]
7/12/2015  A       [105]
dtype: object

我只是不知道如何让 wt_diffs 恢复到每一行的原始 df。

非常感谢您的帮助。 . . 约翰

您可以使用 GroupBy.transform:

>>> f = df.groupby(['City', 'Date'])['Weight'].transform
>>> df['Wt_Diff'] = f('max') - f('min')
>>> df
  City       Date Sex  Weight  Wt_Diff
0    A  6/12/2015   M     185       65
1    A  6/12/2015   F     120       65
2    A  7/12/2015   M     210      105
3    A  7/12/2015   F     105      105
4    B  6/12/2015   M     225       70
5    B  6/12/2015   F     155       70
6    B  6/19/2015   M     167       46
7    B  6/19/2015   F     121       46

编辑:如果 max - min 不起作用,最简单的方法是先添加 signed 权重列:

>>> df['+/-Weight'] = df['Weight'].where(df['Sex'] == 'M', -df['Weight'])
>>> df['Wt_Diff'] = df.groupby(['City', 'Date'])['+/-Weight'].transform('sum')