分组一列,找到pandas中其他两列差异的最大(绝对)值

时间:2017-07-06 01:39:46

标签: python pandas dataframe

我有一个大约有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; 但不确定我是否能够指向方向。

2 个答案:

答案 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。你也可以使用mergejoin,我已经习惯了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