You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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会是这样的结构(前几行):

earningsname
4564552Sam
4573547Jack
3567567Matt
......

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:00:40