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
相关产品推荐
相关产品推荐

