Python Pandas:基于相同Source、Level、County列值合并Town列取值
解决方案
直接使用groupby分组聚合即可实现需求,核心要注意开启dropna=False保证空值参与分组,避免时间行被丢弃:
首先是示例数据构造(你可以跳过这步直接用你自己的DataFrame):
import pandas as pd import numpy as np df = pd.DataFrame({ 'Time': ['2021-12-01 10:01:41.443', np.nan, np.nan, np.nan, '2021-12-01 10:01:46.452'], 'Source': [np.nan, 'Test', 'Test', 'Test', np.nan], 'Level': [np.nan, '3', '5-', '5-', np.nan], 'County': [np.nan, 'C1', 'C2', 'C2', np.nan], 'Town': [np.nan, 'C1-T1', 'C2-T0', 'C2-T1', np.nan] })
核心实现代码:
res = df.groupby( # 分组键包含Time是为了让带时间的行单独成组,保留原有位置 ['Time', 'Source', 'Level', 'County'], dropna=False, # 必须开启,否则含NaN的分组会被直接丢弃 as_index=False, sort=False # 关闭自动排序,完全保留原始数据的行顺序 )['Town'].agg( # 同分组先去重再用英文逗号拼接 lambda x: ', '.join(pd.unique(x)) )
补充说明
- 即使所有字段都是字符串类型也完全兼容,不需要额外做类型转换
- 如果不需要Town值去重,可以把聚合逻辑直接改成
', '.join即可 - 输出结果会完全保留原始时间行的顺序,和你期望的输出格式一致
内容的提问来源于stack exchange,提问作者Lambertchen
相关产品推荐
相关产品推荐

