You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:36:19