首页 > 解决方案 > 如何使用pandas根据分组数据减去一列的行?

问题描述

我正在尝试根据第一个和最后一个日期按组计算列的行之间的差异。例如:

df = pd.DataFrame({'ID':["a","a","a","b","b","b"],
                   'start_yr':[2010,2013,2020,2009,2005,2019],
                   'amt':[10,40,30,50,60,100]})

应该返回

a 20   (30-10)
b 40   (100 - 60)

我试过这样的东西,但我肯定错过了一些东西。

#df['diff'] = df.groupby('ID')['start_yr','amt'].transform(lambda x: (x.max()-x.min()))
df['diff'] = dThe f.groupby('ID')['start_yr'].transform(lambda x: (x.max()-x.min()))

标签: pythonpandasdatepandas-groupbysubtraction

解决方案


首先对两列进行排序DataFrame.sort_values,然后用 中的第一个值减去最后一个GroupBy.agg

df1 = (df.sort_values(['ID','start_yr'])
         .groupby('ID')['amt']
         .agg(lambda x: (x.iat[-1]-x.iat[0]))
         .reset_index())

或用聚合GroupBy.first和减去值GroupBy.last

df = df.sort_values(['ID','start_yr'])
g = df.groupby('ID')['amt']

df1 = g.last().sub(g.first()).reset_index()

或者对于第一个和最后一个值是可能的使用DataFrame.drop_duplicates

df = df.sort_values(['ID','start_yr'])

df1 = (df.drop_duplicates('ID', keep='last').set_index('ID')['amt']
         .sub(df.drop_duplicates('ID').set_index('ID')['amt'])
         .reset_index())

print (df1)
  ID  amt
0  a   20
1  b   40

编辑:这是一个想法,无需先按索引(此处)按最小值和最大值对值进行排序:DataFrameGroupBy.idxmax DataFrameGroupBy.idxminamtstart_yr

g = df.set_index('amt').groupby('ID')['start_yr']

s = g.idxmax().sub(g.idxmin()).reset_index()
print (s)
  ID  start_yr
0  a        20
1  b        40

推荐阅读