如何在Pandas中合并同name/last_name/address行的x_list与y_list?
解决方案
针对你的需求,我们可以利用Pandas的groupby+agg组合高效完成分组合并操作,5.8万行数据的处理完全可以轻松应对。
步骤1:数据准备(如果是从外部导入数据,需先确保列表格式正确)
如果你的x_list和y_list是字符串格式(比如"['one']"),需要先转换成实际的列表对象:
import pandas as pd import ast # 假设从CSV读取数据 df = pd.read_csv('your_data.csv') # 将字符串格式的列表转为实际列表 df['x_list'] = df['x_list'].apply(ast.literal_eval) df['y_list'] = df['y_list'].apply(ast.literal_eval)
步骤2:分组合并核心代码
from itertools import chain # 按指定列分组,聚合生成结果 result_df = df.groupby(['name', 'last_name', 'address'], as_index=False).agg( id=('id', 'first'), # 取每组的第一个id x_list=('x_list', lambda x: list(chain.from_iterable(x))), # 合并x列表 y_list=('y_list', lambda x: list(chain.from_iterable(x))) # 合并y列表 ) # 按id排序,和示例输出顺序一致 result_df = result_df.sort_values('id').reset_index(drop=True)
代码说明
- 分组键:以
name、last_name、address作为分组依据,确保相同信息的行被归为一组。 - 聚合规则:
id取每组的第一个值,和你给出的输出示例对应;- 使用
itertools.chain.from_iterable合并列表,相比sum(x, []),它通过迭代器拼接,内存占用更低,处理大量数据时性能更优。
- 排序重置索引:保证最终结果的顺序和示例一致。
示例验证
用你提供的测试数据运行上述代码,会得到完全符合要求的输出:
| id | name | last_name | address | x_list | y_list |
|---|---|---|---|---|---|
| 1 | 'John' | 'Smith' | 'add_1' | ['one', 'three'] | [1, 3] |
| 2 | 'Tom' | 'Davis' | 'add_2' | ['two', 'four'] | [2, 4] |
| 3 | 'Susan' | 'Jones' | 'add_1' | ['one'] | [1] |
内容的提问来源于stack exchange,提问作者Elaol
相关产品推荐
相关产品推荐

