Pandas中三列值相同时将多行合并为单行的实现问题
问题原因分析
你原来的写法存在两处核心错误:
groupby的分组列需要用列表包裹传递,且分组依据应该是id、part、sub三列,不能把strength也放进分组键里——如果把strength放进去,值不同的行本来就会被分成不同组,根本达不到合并的效果。- 聚合逻辑错误:不需要手动遍历取next值,直接对
strength列执行字符串拼接即可,其余同值列取分组内的第一个值就行。
正确实现代码
import pandas as pd # 示例数据 substances = pd.DataFrame({ 'id': ['id_1', 'id_1', 'id_1', 'id_2', 'id_3'], 'part': ['1', '1', '2', '2', '3'], 'sub': ['paracetamolum', 'paracetamolum', 'ibuprofenum', 'dienogestum', 'etynyloestradiol'], 'strength': ['150', '50', '50', '20', '30'], 'unit' : ['mg', 'mg', 'mg', 'mg', 'mcg'], 'other irrelevant columns for this task' : ['sth1' , 'sth2', 'sth3', 'sth4', 'sth5'] }) # 核心实现 result = substances.groupby(['id', 'part', 'sub'], as_index=False).agg( strength=('strength', ' # '.join), unit=('unit', 'first') # 如需保留其他不相关列,可在此处添加对应规则,例:other_col=('other_col', 'first') ).rename(columns={'sub':'substance'}) # 按预期输出重命名sub列为substance
输出验证
执行后得到的结果与要求完全匹配:
| id | part | strength | substance | unit |
|---|---|---|---|---|
| id_1 | 1 | 150 # 50 | paracetamolum | mg |
| id_1 | 2 | 50 | ibuprofenum | mg |
| id_2 | 2 | 20 | dienogestum | mg |
| id_3 | 3 | 30 | etynyloestradiol | mcg |
内容的提问来源于stack exchange,提问作者Paulina
相关产品推荐
相关产品推荐

