我有一个大约有20列的数据框,但我需要groupby一个名为ID的列并计算差异,让我们称之为value1和value2列。 示例df:
ID value1 value2
1 3 2
1 6 2
2 6 1
3 5 8
4 7 2
4 3 2
期望的输出:
ID value1 value2 maxabs
1 3 2 4
1 6 2 4
2 6 1 5
3 5 8 3
4 7 2 5
4 3 2 5
我已经尝试过这个:
df['maxabs'] = df.groupby(['ID'])[(df['value1'] - df['value2'])].abs().idxmax()
错误说找不到列并给我打了很多'nan'。列肯定在那里。也许我需要添加两个值都是'nan'来打印'nan; 但不确定我是否能够指向方向。
答案 0 :(得分:3)
切换计算顺序;首先计算 value1 和 value2 之间的差异,然后按ID分组并使用max
计算transform
:
df['maxabs'] = df.value1.sub(df.value2).abs().groupby(df.ID).transform('max')
df
# ID value1 value2 maxabs
#0 1 3 2 4
#1 1 6 2 4
#2 2 6 1 5
#3 3 5 8 3
#4 4 7 2 5
#5 4 3 2 5
答案 1 :(得分:2)
试试这个。 PS。你也可以使用merge
或join
,我已经习惯了map
df['maxabs']=df.ID.map(df.groupby(['ID']).apply(lambda x: max(abs(x.value1-x.value2))))
ID value1 value2 maxabs
0 1 3 2 4
1 1 6 2 4
2 2 6 1 5
3 3 5 8 3
4 4 7 2 5
5 4 3 2 5