看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们在使用 Excel 的时候,常常会在数据最后,增加一行汇总数据,将所在列加和或者求平均等。那么,怎么用 Pandas 来实现这个常见的操作呢?
先构造数据如下:
import pandas as pd
import numpy as np
np.random.seed(999)
df = pd.DataFrame(np.random.randint(1.4, 10., size=(3, 4)),
columns=list('abcd'))
df
'''
a b c d
0 1 6 2 9
1 2 4 1 6
2 9 9 1 6
'''
上边的数据共三行,根据需求,需要增加一行,来汇总 a、b、c 三列的总和,并将这个行索引命名为「all」。
我们知道 df.sum()
可以生成一个按列的汇总序列,接下来是如何将这个序列增加到末尾行中,并索引起名「all」。
这里有两个方法,一是用 df.append
追加数据,会追加到最后一行,但追加时需要将序列转为 Series 并起名「all」,二是修改 df ,用 df.loc
赋值的方法增加一个新行。
df.append(pd.Series(df.sum(), name='all'))
'''
a b c d
0 1 6 2 9
1 2 4 1 6
2 9 9 1 6
all 12 19 4 21
'''
但 append() 方法将在未来不能使用(pandas 2.1 开始已经不支持了,参考:pandas 数据追加合并 df.append),可以改用 pd.concat() 来拼接数据:
ser = df.sum().rename('all')
pd.concat([df, ser.to_frame().T])
# ...
或者:
pd.concat([df, df.sum(numeric_only=True).to_frame('all').T])
# ...
df.loc['all',:] = df.sum(numeric_only=True)
df
# 结果同方法一
用 groupby 聚合汇总后再拼接:
total = df.groupby(lambda _: '总计').sum(numeric_only=True)
total
'''
Q1 Q2 Q3 Q4
总计 340 263 211 369
'''
pd.concat([df,total]).fillna('/')
'''
name team Q1 Q2 Q3 Q4
0 Liver E 89 21 24 64
1 Arry C 36 37 37 57
2 Ack A 57 60 18 84
3 Eorge C 93 96 71 78
4 Oah D 65 49 61 86
...
总计 / / 340 263 211 369
'''
这样就完成了需求。
(完)
更新时间:2024-08-18 15:40:31 标签:pandas python 汇总