首页 > 解决方案 > 将 Pandas groupby 与总列和总行一起使用

问题描述

我的代码中使用的 Dataframe 列出了属于所有者的资本和收益金额。目的是按所有者对值进行分组,然后将总计列添加到 groupby 数据框,然后添加全局总计行。

这是代码:

    import pandas as pd

OWNER = 'OWNER'
CAPITAL = 'CAPITAL'
YIELD = 'YIELD AMT'
TOTAL = 'TOTAL'

# defining the dataframe
df = pd.DataFrame({OWNER: 2 * ['Joe'] + 3 * ['Carla'] + ['Rob'],
                   CAPITAL: [10000, 5000, 20000, 3000, -4000, 2000],
                   YIELD: [1000, 500, 2000, 300, 400, 200]})
'''
   OWNER  CAPITAL  YIELD AMT
0    Joe    10000       1000
1    Joe     5000        500
2  Carla    20000       2000
3  Carla     3000        300
4  Carla    -4000        400
5    Rob     2000        200
'''

print(df)
print()

# grouping the rows by owner
dfg = df.groupby([OWNER]).sum().reset_index()
'''
   OWNER  CAPITAL  YIELD AMT
0  Carla    19000       2700
1    Joe    15000       1500
2    Rob     2000        200
'''

print(dfg)
print()

# adding a TOTAL column
for index in range(0, len(dfg)):
    dfg.loc[index, TOTAL] = dfg.loc[index, CAPITAL] + dfg.loc[index, YIELD]
'''
   OWNER  CAPITAL  YIELD AMT    TOTAL
0  Carla    19000       2700  21700.0
1    Joe    15000       1500  16500.0
2    Rob     2000        200   2200.0
'''

print(dfg)
print()

# resetting index to OWNER column
dfg = dfg.set_index(OWNER)
'''
       CAPITAL  YIELD AMT    TOTAL
OWNER
Carla    19000       2700  21700.0
Joe      15000       1500  16500.0
Rob       2000        200   2200.0
'''

print(dfg)
print()

# finally, adding a TOTAL row
dfg.loc[TOTAL] = dfg.sum(numeric_only=True, axis=0)[[CAPITAL, YIELD, TOTAL]]
'''
       CAPITAL  YIELD AMT    TOTAL
OWNER
Carla  19000.0     2700.0  21700.0
Joe    15000.0     1500.0  16500.0
Rob     2000.0      200.0   2200.0
TOTAL  36000.0     4400.0  40400.0
'''

print(dfg.fillna(''))

我的问题是:是否有更简洁的方法来使用 Pandas agg() 或 aggregate() 和 lambda 表达式对总列或行计算进行编码?

标签: python-3.xpandas-groupby

解决方案


df[TOTAL] = df[CAPITAL] + df[YIELD]
output = df.groupby(by=[OWNER]).sum()

就是你要找的。output是您需要的数据框。


推荐阅读