Python Pandas实现重复站点与对应所有者的有序匹配
Pandas 有序生成重复站点及对应所有者列
原始数据
import pandas as pd df = pd.DataFrame({ 'Lineup ID':['1691', '1691', '1691', '1691', '1691', '1691'], 'Station':['WRCB', 'WAAY', 'WXIA', 'WAFF', 'WTVC', 'WPXA'], 'Affiliation':['NBC', 'NBC', 'NBC', 'ABC', 'ABC', 'ION'], 'Owner':['Sarkes', 'Gray', 'Tegna', 'Allen', 'Sinclair', 'Scripps'], })
需求
- 新增
Duplicate Station列:显示与当前行Lineup ID和Affiliation相同的其他站点,多个站点用逗号分隔 - 新增
Duplicate Owner列:对应上述重复站点的所有者,需与Duplicate Station的顺序完全一致;若该分组无其他站点则为空
当前问题
使用分组聚合set的方式实现时,站点和所有者的顺序无法匹配(例如WXIA行的所有者顺序与站点顺序不对应),因为set是无序结构,会打乱原始数据的顺序。
解决方案
通过分组后保留原始顺序的列表,再逐行筛选排除自身的方式实现:
# 按Lineup ID和Affiliation分组,生成每个组的站点列表和所有者列表 grouped = df.groupby(['Lineup ID', 'Affiliation']).apply( lambda x: pd.Series({ 'station_list': x['Station'].tolist(), 'owner_list': x['Owner'].tolist() }) ).reset_index() # 将分组结果合并回原DataFrame df = df.merge(grouped, on=['Lineup ID', 'Affiliation'], how='left') # 生成Duplicate Station和Duplicate Owner列 def get_duplicates(row): # 获取当前站点在列表中的索引 idx = row['station_list'].index(row['Station']) # 复制列表并移除当前站点/所有者 dup_stations = row['station_list'][:idx] + row['station_list'][idx+1:] dup_owners = row['owner_list'][:idx] + row['owner_list'][idx+1:] # 转为逗号分隔的字符串,无重复则为空 return ','.join(dup_stations), ','.join(dup_owners) df[['Duplicate Station', 'Duplicate Owner']] = df.apply(get_duplicates, axis=1, result_type='expand') # 清理临时列 df = df.drop(['station_list', 'owner_list'], axis=1)
结果展示
处理后的DataFrame如下:
| Lineup ID | Station | Affiliation | Owner | Duplicate Station | Duplicate Owner |
|---|---|---|---|---|---|
| 1691 | WRCB | NBC | Sarkes | WAAY,WXIA | Gray,Tegna |
| 1691 | WAAY | NBC | Gray | WRCB,WXIA | Sarkes,Tegna |
| 1691 | WXIA | NBC | Tegna | WRCB,WAAY | Sarkes,Gray |
| 1691 | WAFF | ABC | Allen | WTVC | Sinclair |
| 1691 | WTVC | ABC | Sinclair | WAFF | Allen |
| 1691 | WPXA | ION | Scripps |
原理说明
- 分组时使用
tolist()保留原始数据的顺序,避免set的无序性 - 通过索引定位当前行在分组列表中的位置,精准排除自身,确保剩余站点和所有者的顺序完全对应
- 使用
apply逐行处理,最终拼接成符合要求的字符串格式
内容的提问来源于stack exchange,提问作者Jpdiv
相关产品推荐
相关产品推荐

