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

Python3.7中DataFrame行条件过滤:同一col1值选无|的行

按规则过滤DataFrame行

原始DataFrame

import pandas as pd

df = pd.DataFrame({
    'col1': ['B20.0', 'B20.0', 'A16'],
    'col2': ['B20 | B20-B20', 'B20', 'A15-A20']
})

需求说明

对相同col1值的行组:

  • 若存在col2为单个值(不含|)的行,保留该行
  • 若所有行的col2都含|,保留组内任意一行

实现方案

方法1:分组排序取首行(高效简洁)

先标记每行是否为单个值,再通过排序赋予优先级,最后分组取最高优先级的行:

# 标记不含|的行
df['is_single'] = ~df['col2'].str.contains('\|')
# 按col1升序、is_single降序排序,确保单个值行排在组内最前
result = df.sort_values(['col1', 'is_single'], ascending=[True, False])
# 分组取每组第一行,重置索引并删除辅助列
result = result.groupby('col1').first().reset_index().drop('is_single', axis=1)

方法2:分组自定义逻辑(直观易读)

通过groupby.apply直接在每组内判断并选择行:

def pick_preferred_row(group):
    # 筛选出不含|的行
    single_rows = group[~group['col2'].str.contains('\|')]
    # 有单个值行则取第一个,否则取组内第一行
    return single_rows.iloc[0] if not single_rows.empty else group.iloc[0]

result = df.groupby('col1').apply(pick_preferred_row).reset_index(drop=True)

输出结果

col1      col2
0   A16    A15-A20
1  B20.0       B20

关于正则的说明

正则是可行的,上面的str.contains('\|')就是用正则匹配|字符(需转义,因为|在正则中是特殊字符)。不过pandas的字符串方法已封装简单匹配逻辑,无需额外写复杂正则,上述两种方法更优——逻辑清晰且性能更好。

内容的提问来源于stack exchange,提问作者rshar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:03:06