在 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')
首先是数据:
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')