如何使用 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
我正在尝试根据第一个日期和最后一个日期按组计算列的行之间的差异。 例如:
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