看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
有些情况下,我们在做数据统计时,会将数据的标记打在表头上,但最终需要统计数据时,需要将表头上的数据分别统计。在本例中,我们抽象一个 pandas 例题,看看如何完成这样的需求。
构造数据如下:
import pandas as pd
import io
data = io.StringIO(
'''
1_2 1_3 1_4 2_3 2_4 3_4
1 5 2 8 2 2
4 3 4 5 8 5
8 8 8 9 3 3
4 3 4 4 8 3
8 0 7 4 2 2
''')
df = pd.read_csv(data, sep=r'\s+')
df
# ...
每个列索引的标签由下划线连接的数字构成,需要计算出每一行每个数字所在的列数字之和。如以上数据有 1 到 4 共 4 个数据,计算 2 所在的 1_2 2_3 2_4
这三列每行的和。最后将它们拼接在原数据右则,即:
'''
1_2 1_3 1_4 2_3 2_4 3_4 1 2 3 4
0 1 5 2 8 2 2 8 11 15 6
1 4 3 4 5 8 5 11 17 13 17
2 8 8 8 9 3 3 24 20 20 14
3 4 3 4 4 8 3 11 16 10 15
4 8 0 7 4 2 2 15 14 6 11
'''
分析下列的标签,数字用下划线分割,我们需要提取出这些数字,然后将每个数字形成一个独立的行,然后分组求得对应数字的和。
具体在代码编写上,先将数据转置,将列分割得到一个元素为列表的列追加在数据上,方便我们进行爆炸,爆炸后数据展开每个数据对应到数字上。
接着按数字进行分组求和,再将数据转置回来。
根据思路,计算数据代码如下:
(
df.T
.assign(foo=df.columns.str.split('_'))
.explode('foo')
.groupby('foo')
.sum()
.T
)
'''
foo 1 2 3 4
0 8 11 15 6
1 11 17 13 17
2 24 20 20 14
3 11 16 10 15
4 15 14 6 11
'''
然后再将得到的这个结果与原数据拼接起来:
df.join(_)
'''
1_2 1_3 1_4 2_3 2_4 3_4 1 2 3 4
0 1 5 2 8 2 2 8 11 15 6
1 4 3 4 5 8 5 11 17 13 17
2 8 8 8 9 3 3 24 20 20 14
3 4 3 4 4 8 3 11 16 10 15
4 8 0 7 4 2 2 15 14 6 11
'''
这样就完成了需求。
(完)
更新时间:2025-02-03 10:11:21 标签:pandas python 标签 索引 求和