如何使用 pandas 根据数据分组减去列的行?

how to use pandas to subtract rows of a column based upon data by group?

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

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]})

应该return

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()))

首先按 DataFrame.sort_values and then subtract last with first value in 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 and 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.idxmin 按索引值(此处 amt)按 start_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

让我们尝试两个步骤:

s = df.sort_values(['ID','start_yr']).groupby(['ID'])['amt'].agg(['first','last'])
output = s['last'] - s['first']

输出:

ID
a    20
b    40
dtype: int64