pandas 如何在python中进行条件聚集AFTER groupby?

zaq34kh6  于 2023-01-24  发布在  Python
关注(0)|答案(2)|浏览(116)

我的第一列是'年'。我的第二列是'银行'。我的最后一列是一个“值”。我想得到年=2003的每个'银行'的值的总和,并显示在一个新的列。即,如果我的开始 Dataframe 可以由以下代码表示:

df = pd.DataFrame({'year' : [2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003],
               'bank' : ['sbi', 'sbi', 'sbi', 'sbi', 'sbi', 'sbi', 'icici', 'icici', 'icici', 'icici', 'icici', 'icici'],
                   'amt' : [1000, 2000, 3000, 4000, 5000, 6000,1,2,3,4,5,6]
                  })

那么最终输出可以用下面的代码表示:

df = pd.DataFrame({'year' : [2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 2003],
                   'bank' : ['sbi', 'sbi', 'sbi', 'sbi', 'sbi', 'sbi', 'icici', 'icici', 'icici', 'icici', 'icici', 'icici'],
                       'amt' : [1000, 2000, 3000, 4000, 5000, 6000,1,2,3,4,5,6],
                       'amt_2003': [9000, 9000, 9000, 9000, 9000, 9000, 9, 9, 9, 9, 9, 9]
                      })

ie -对于'sbi','year'= 2003中的总'value'为3000+6000=9000,它针对'sbi'的所有行显示。类似地,我针对'icci'的所有行得到9。
在使用groupby('bank')语句后,我无法使用条件求和。

jhiyze9q

jhiyze9q1#

您可能需要执行groupby.sum,然后执行unstackmerge

df2 = df.groupby(['year', 'bank']).sum().unstack('year')
df2.columns = df2.columns.map(lambda x: f'{x[0]}_{x[1]}')

out = df.merge(df2.reset_index())

输出:

year   bank   amt  amt_2001  amt_2002  amt_2003
0   2001    sbi  1000      5000      7000      9000
1   2002    sbi  2000      5000      7000      9000
2   2003    sbi  3000      5000      7000      9000
3   2001    sbi  4000      5000      7000      9000
4   2002    sbi  5000      5000      7000      9000
5   2003    sbi  6000      5000      7000      9000
6   2001  icici     1         5         7         9
7   2002  icici     2         5         7         9
8   2003  icici     3         5         7         9
9   2001  icici     4         5         7         9
10  2002  icici     5         5         7         9
11  2003  icici     6         5         7         9
  • 注意:如果您有多个输入列,那么这不仅适用于"amt"。*

中间体df2

amt_2001  amt_2002  amt_2003
bank                               
icici         5         7         9
sbi        5000      7000      9000

要限制要保留的年份,请使用loc切片:

keep = [2003]

df2 = df.groupby(['year', 'bank']).sum().loc[keep].unstack('year')
df2.columns = df2.columns.map(lambda x: f'{x[0]}_{x[1]}')

out = df.merge(df2.reset_index())

输出:

year   bank   amt  amt_2003
0   2001    sbi  1000      9000
1   2002    sbi  2000      9000
2   2003    sbi  3000      9000
3   2001    sbi  4000      9000
4   2002    sbi  5000      9000
5   2003    sbi  6000      9000
6   2001  icici     1         9
7   2002  icici     2         9
8   2003  icici     3         9
9   2001  icici     4         9
10  2002  icici     5         9
11  2003  icici     6         9
0md85ypi

0md85ypi2#

2003的已筛选行使用Series.map,按列amt使用聚合sum

df['amt_2003'] = df['bank'].map(df[df['year'].eq(2003)].groupby('bank')['amt'].sum())

或者使用Series.where将非2003值替换为0,并使用GroupBy.transform替换新列:

df['amt_2003'] = df['amt'].where(df['year'].eq(2003),0).groupby(df['bank']).transform('sum')
print (df)
    year   bank   amt  amt_2003
0   2001    sbi  1000      9000
1   2002    sbi  2000      9000
2   2003    sbi  3000      9000
3   2001    sbi  4000      9000
4   2002    sbi  5000      9000
5   2003    sbi  6000      9000
6   2001  icici     1         9
7   2002  icici     2         9
8   2003  icici     3         9
9   2001  icici     4         9
10  2002  icici     5         9
11  2003  icici     6         9

对于所有色谱柱,使用DataFrame.pivot_tableDataFrame.add_prefixDataFrame.join

df1 = (df.join(df.pivot_table(index='bank', columns='year',values='amt', aggfunc='sum')
                 .add_prefix('amt_'), on='bank'))
print (df1)
    year   bank   amt  amt_2001  amt_2002  amt_2003
0   2001    sbi  1000      5000      7000      9000
1   2002    sbi  2000      5000      7000      9000
2   2003    sbi  3000      5000      7000      9000
3   2001    sbi  4000      5000      7000      9000
4   2002    sbi  5000      5000      7000      9000
5   2003    sbi  6000      5000      7000      9000
6   2001  icici     1         5         7         9
7   2002  icici     2         5         7         9
8   2003  icici     3         5         7         9
9   2001  icici     4         5         7         9
10  2002  icici     5         5         7         9
11  2003  icici     6         5         7         9

相关问题