如何按条件修改含重复姓名的DataFrame 实现分组标记与合同数求和
解决方案
针对按id、name维度分组统计的需求,可根据你的数据处理环境选择对应实现方案,两种方案在大数据量场景下都有稳定的性能表现,核心逻辑一致:
- 对
number of contracts字段分组求和,得到单组合同总数量 - 对
Capitalization字段做分组判断:如果分组下同时存在yes和no两个值,标记为both;如果仅存在yes则标记为yes;仅存在no则标记为no
Python Pandas 实现
适合本地处理离线表格数据的场景:
import pandas as pd # 替换为实际数据读取逻辑,支持pd.read_csv、pd.read_excel、pd.read_sql等 df = pd.read_csv("your_data_path.csv") # 分组聚合计算 result = df.groupby(['id', 'name'], as_index=False).agg( **{'number of contracts': ('number of contracts', 'sum')}, Capitalization_x=('Capitalization', lambda x: 'both' if {'yes','no'}.issubset(set(x)) else x.iloc[0]) ) # 结果导出或后续处理 result.to_csv("result.csv", index=False)
优化提示:数据量超过百万级时,可以先把
Capitalization字段转为category类型,能进一步提升30%以上的聚合计算速度。
SQL 实现
适合直接在数据库/数仓中处理大规模数据的场景:
SELECT id, name, CASE WHEN COUNT(DISTINCT Capitalization) = 2 THEN 'both' ELSE MAX(Capitalization) END AS Capitalization_x, SUM(`number of contracts`) AS `number of contracts` FROM your_table_name GROUP BY id, name;
两种方案运行后输出的结果和预期完全一致:
| id | name | Capitalization_x | number of contracts |
|---|---|---|---|
| 1 | Jimmy | both | 4 |
| 2 | Jenny | no | 7 |
| 3 | Elle | yes | 5 |
| 4 | Danny | yes | 2 |
| 5 | Charles | yes | 1 |
| 6 | Freddy | no | 3 |
| 7 | Elle | both | 8 |
内容的提问来源于stack exchange,提问作者Jimmy Auris
相关产品推荐
相关产品推荐

