Pandas groupby 和减去行

我有以下数据框:


id variable year value

1      a    2020   2

1      a    2021   3

1      a    2022   5

1      b    2020   3

1      b    2021   8

1      b    2022   10

我想对 id 和变量进行分组,并从组的所有行中减去 2020 值。所以我会得到:


id variable year value

1      a    2020   0

1      a    2021   1

1      a    2022   3

1      b    2020   0

1      b    2021   5

1      b    2022   7

我怎样才能做到这一点?


绝地无双
浏览 121回答 2
2回答

慕田峪9158850

DataFrame.merge如果不确定是否2020是每个组的第一个,请使用:df1 = df[df['year'].eq(2020)]df['value'] -= df.merge(df1,how='left',on=['id','variable'],suffixes=('_',''))['value'].valuesprint (df)   id variable  year  value0   1        a  2020      01   1        a  2021      12   1        a  2022      33   1        b  2020      04   1        b  2021      55   1        b  2022      7如果2020总是每组第一个GroupBy.transform使用GroupBy.first:df['value'] -= df.groupby(['id','variable'])['value'].transform('first')print (df)   id variable  year  value0   1        a  2020      01   1        a  2021      12   1        a  2022      33   1        b  2020      04   1        b  2021      55   1        b  2022      7编辑:如果数据中的2020每组重复行解决方案首先删除重复项并仅减去第一个值:print (df)   id variable  year  value0   1        a  2020      31   1        a  2020      22   1        a  2022      53   1        b  2020      34   1        b  2021      85   1        b  2022     10df1 = df[df['year'].eq(2020)]df['value'] -= df.merge(df1.drop_duplicates(['id','variable']),                        how='left',                        on=['id','variable'],                        suffixes=('_',''))['value'].valuesprint (df)   id variable  year  value0   1        a  2020      01   1        a  2020     -12   1        a  2022      23   1        b  2020      04   1        b  2021      55   1        b  2022      7或聚合值,例如通过sum重复数据删除:print (df)   id variable  year  value0   1        a  2020      31   1        a  2020      12   1        a  2022      53   1        b  2020      34   1        b  2021      85   1        b  2022     10df = df.groupby(['id','variable','year'], as_index=False).sum()print (df)   id variable  year  value0   1        a  2020      41   1        a  2022      52   1        b  2020      33   1        b  2021      84   1        b  2022     10df1 = df[df['year'].eq(2020)]df['value'] -= df.merge(df1, how='left',                        on=['id','variable'],                        suffixes=('_',''))['value'].valuesprint (df)   id variable  year  value0   1        a  2020      01   1        a  2022      12   1        b  2020      03   1        b  2021      54   1        b  2022      7

阿晨1998

虽然2020不是我们可以使用的第一个组:GroupBy.transformwithSeries.wheredf['value']= df['value'].sub(df['value'].where(df['year'].eq(2020))                                        .groupby([df['id'],df['variable']])                                        .transform('max'))print(df)   id variable  year  value0   1        a  2020    0.01   1        a  2021    1.02   1        a  2022    3.03   1        b  2020    0.04   1        b  2021    5.05   1        b  2022    7.0如果年份是string你可能需要df['year'].eq('2020')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python