为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas groupby 和减去行

Pandas groupby 和减去行

绝地无双 2022-07-19 20:33:28
我有以下数据框:id variable year value1      a    2020   21      a    2021   31      a    2022   51      b    2020   31      b    2021   81      b    2022   10我想对 id 和变量进行分组,并从组的所有行中减去 2020 值。所以我会得到:id variable year value1      a    2020   01      a    2021   11      a    2022   31      b    2020   01      b    2021   51      b    2022   7我怎样才能做到这一点?
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

DataFrame.merge如果不确定是否2020是每个组的第一个,请使用:


df1 = df[df['year'].eq(2020)]

df['value'] -= df.merge(df1,how='left',on=['id','variable'],suffixes=('_',''))['value'].values

print (df)

   id variable  year  value

0   1        a  2020      0

1   1        a  2021      1

2   1        a  2022      3

3   1        b  2020      0

4   1        b  2021      5

5   1        b  2022      7

如果2020总是每组第一个GroupBy.transform使用GroupBy.first:


df['value'] -= df.groupby(['id','variable'])['value'].transform('first')

print (df)

   id variable  year  value

0   1        a  2020      0

1   1        a  2021      1

2   1        a  2022      3

3   1        b  2020      0

4   1        b  2021      5

5   1        b  2022      7

编辑:


如果数据中的2020每组重复行解决方案首先删除重复项并仅减去第一个值:


print (df)

   id variable  year  value

0   1        a  2020      3

1   1        a  2020      2

2   1        a  2022      5

3   1        b  2020      3

4   1        b  2021      8

5   1        b  2022     10


df1 = df[df['year'].eq(2020)]

df['value'] -= df.merge(df1.drop_duplicates(['id','variable']),

                        how='left',

                        on=['id','variable'],

                        suffixes=('_',''))['value'].values


print (df)

   id variable  year  value

0   1        a  2020      0

1   1        a  2020     -1

2   1        a  2022      2

3   1        b  2020      0

4   1        b  2021      5

5   1        b  2022      7

或聚合值,例如通过sum重复数据删除:


print (df)

   id variable  year  value

0   1        a  2020      3

1   1        a  2020      1

2   1        a  2022      5

3   1        b  2020      3

4   1        b  2021      8

5   1        b  2022     10


df = df.groupby(['id','variable','year'], as_index=False).sum()

print (df)

   id variable  year  value

0   1        a  2020      4

1   1        a  2022      5

2   1        b  2020      3

3   1        b  2021      8

4   1        b  2022     10


df1 = df[df['year'].eq(2020)]

df['value'] -= df.merge(df1, how='left',

                        on=['id','variable'],

                        suffixes=('_',''))['value'].values


print (df)

   id variable  year  value

0   1        a  2020      0

1   1        a  2022      1

2   1        b  2020      0

3   1        b  2021      5

4   1        b  2022      7


查看完整回答
反对 回复 2022-07-19
?
阿晨1998

TA贡献2037条经验 获得超6个赞

虽然2020不是我们可以使用的第一个组:GroupBy.transformwithSeries.where


df['value']= df['value'].sub(df['value'].where(df['year'].eq(2020))

                                        .groupby([df['id'],df['variable']])

                                        .transform('max'))

print(df)

   id variable  year  value

0   1        a  2020    0.0

1   1        a  2021    1.0

2   1        a  2022    3.0

3   1        b  2020    0.0

4   1        b  2021    5.0

5   1        b  2022    7.0

如果年份是string你可能需要


df['year'].eq('2020')


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信