如何在Pandas中基于多列字符串汇总指定列数值?
解决Pandas多列姓名的薪资汇总问题
嘿,我来帮你搞定这个需求!要把分散在多列里的同名员工薪资加总起来,用Pandas的melt+groupby组合就能轻松实现,步骤很清晰,我给你一步步演示:
1. 先构造示例数据
首先咱们把你提供的数据转换成DataFrame,方便后续操作:
import pandas as pd data = { 'worker1': ['Sam', 'Jack', 'Matt', 'Paul', 'Tim'], 'worker2': ['Alex', 'Amy', 'Sam', 'Alice', 'Amanda'], 'worker3': ['Alice', 'Aaron', 'Tony', 'Jack', 'Sam'], 'earnings': [4564552, 4573547, 3567567, 6357653, 2890000] # 补全了最后一个薪资值方便测试 } df = pd.DataFrame(data)
2. 把宽表转成窄表(关键步骤)
你的数据是宽格式:每个行里有多个员工姓名,咱们需要把它转成窄格式——每一行只对应一个员工姓名和他所在行的薪资。这一步用melt函数就能完成:
# 将三个worker列合并成一个姓名列,同时保留对应的薪资 melted_df = df.melt( id_vars=['earnings'], # 保留薪资列作为关联项 value_vars=['worker1', 'worker2', 'worker3'], # 需要合并的姓名列 value_name='name' # 新的姓名列名称 )
转换后的melted_df会是这样的结构(前几行):
| earnings | name |
|---|---|
| 4564552 | Sam |
| 4573547 | Jack |
| 3567567 | Matt |
| ... | ... |
3. 按姓名汇总薪资
现在数据结构清晰了,直接按name分组,对earnings求和就行:
# 分组求和,并用reset_index把索引转成列 total_earnings = melted_df.groupby('name')['earnings'].sum().reset_index() # 可选:按薪资从高到低排序,方便查看结果 total_earnings = total_earnings.sort_values(by='earnings', ascending=False)
最终结果
运行完上面的代码,你会得到每个员工的总薪资表,比如:
name earnings 1 Sam 11022119 0 Jack 10931200 2 Alice 10922205 8 Paul 6357653 4 Amy 4573547 5 Aaron 4573547 3 Alex 4564552 6 Matt 3567567 7 Tony 3567567 9 Tim 2890000 10 Amanda 2890000
小提示
如果你的姓名列可能存在空值,可以在分组前先过滤掉:
melted_df = melted_df.dropna(subset=['name'])
这样就完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

