如何在Pandas中找出多父OD对应的重复子OD对并展示父OD
问题描述
现有包含父-子起点终点关系的DataFrame:
parent_origin parent_destination child_origin child_destination 0 ABD NCL ABD ALM 1 ABD NCL ABD DHM 2 ABD YRK ABD ALM 3 ABD YRK ABD NTR 4 ABD KGX ABD SVG
需求:按child_origin和child_destination分组,找出对应两组及以上不同父OD的子OD对,并展示这些子OD对对应的所有父OD信息。预期输出示例:
child_origin child_destination parent_origin parent_destination ABD ALM ABD NCL ABD YRK
你之前尝试用groupby.size()统计数量,但无法获取父OD的具体值,需要更合适的方法。
解决方案
方法一:直接筛选符合条件的行
使用groupby.filter()可以直接从原DataFrame中筛选出满足条件的子OD对应的所有行,保留完整的父OD信息:
import pandas as pd # 构造示例数据(如果已有df可跳过此步) data = { 'parent_origin': ['ABD', 'ABD', 'ABD', 'ABD', 'ABD'], 'parent_destination': ['NCL', 'NCL', 'YRK', 'YRK', 'KGX'], 'child_origin': ['ABD', 'ABD', 'ABD', 'ABD', 'ABD'], 'child_destination': ['ALM', 'DHM', 'ALM', 'NTR', 'SVG'] } df = pd.DataFrame(data) # 筛选出父OD数量>1的子OD对应的所有行 result = df.groupby(['child_origin', 'child_destination']).filter(lambda x: len(x) > 1) print(result)
运行后输出:
parent_origin parent_destination child_origin child_destination 0 ABD NCL ABD ALM 2 ABD YRK ABD ALM
方法二:格式化显示(合并重复子OD单元格)
如果需要像示例那样合并重复的子OD单元格(仅用于美观展示,不改变数据结构),可以用Pandas的样式功能(适合Jupyter环境):
# 对结果进行样式设置,合并重复的子OD单元格 styled_result = result.style \ .hide(axis='index') \ .set_table_styles([ {'selector': 'td, th', 'props': [('border', '1px solid #ccc')]} ]) \ .apply( lambda col: [ 'border-top: none' if i > 0 and col.iloc[i] == col.iloc[i-1] else '' for i in range(len(col)) ], axis=0 ) # 在Jupyter中显示格式化后的表格 display(styled_result)
这会生成和你预期一致的合并单元格样式。
为什么你的原方法不行?
你之前用groupby.size()只能得到每个子OD的父OD计数,而filter()方法会保留原数据的所有行,直接返回符合条件的完整记录,完全满足需求。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

