首页 > 解决方案 > pandas groupby,上下组成员的区别

问题描述

假设我有df

df = pd.DataFrame({'ID': ['a', 'b', 'b', 'b', 'c', 'c'],
                  'V1': [1,2,3,4,5,6],
                  'V2': [7,8,9,19,11,12]})

我想创建一个新列,指示“顶部”组成员和“底部”组成员V3之间的区别。结果将如下所示:V2V1

    ID  V1  V2  V3
0   a   1   7   6
1   b   2   8   4
2   b   3   9   4
3   b   4   19  4
4   c   5   11  5
5   c   6   12  5

我尝试了这样的方法,但它不起作用:

df.groupby('ID').apply(lambda x: x.head(1).V2-x.tail(1).V1)

标签: pythonpandasdataframegroup-by

解决方案


使用GroupBy.transformwithfirstlast减去 by Series.sub

df['V3'] = df.groupby('ID').V2.transform('first').sub(df.groupby('ID').V1.transform('last'))

您的解决方案应通过选择位置和来更改Series.map

s = df.groupby('ID').apply(lambda x: x.V2.iat[0]-x.V1.iat[-1])
df['V3'] = df['ID'].map(s)
print (df)
  ID  V1  V2  V3
0  a   1   7   6
1  b   2   8   4
2  b   3   9   4
3  b   4  19   4
4  c   5  11   5
5  c   6  12   5

推荐阅读