如何筛选含(R)的列并保留Class列以复制DataFrame
问题描述
我有如下表格:
| Class | Health (R) | Pension (R) | Health (E) | Pension (E) |
|---|---|---|---|---|
| 10 | 1.00 | 2.50 | 1.25 | 3.00 |
| 11 | 1.00 | 2.50 | 1.25 | 3.00 |
| 12 | 1.00 | 2.50 | 1.25 | 3.00 |
含(E)和(R)的列是通过pandas的pivot函数动态生成的,无法直接指定列名。使用df.filter(like = "(R)")可以筛选出含(R)的列,但还需要保留Class列。尝试用df.filter(regex = r"(Class|(R)")时,会误选所有含()的列。请问如何提取Class列和含(R)的列来创建新的DataFrame?
解决方案
这里有几种可靠的实现方法:
方法1:拼接筛选结果
先单独提取Class列,再和含(R)的列横向拼接,逻辑简单直观:
import pandas as pd # 合并Class列与含(R)的列 filtered_df = pd.concat([df[['Class']], df.filter(like='(R)')], axis=1)
方法2:修正正则表达式
之前的正则问题在于未正确转义括号(括号是正则特殊字符),调整后可精准匹配目标列:
# 正则匹配Class列,或列名以"(R)"结尾的列 filtered_df = df.filter(regex=r'^Class$|\(R\)$')
^Class$:精确匹配Class列,避免匹配到名称含Class的其他列\(R\)$:匹配以"(R)"结尾的列,\用于转义括号|:表示逻辑或,满足任意一个条件即可
方法3:列名列表推导
手动生成目标列名列表,再提取对应列,灵活性更高:
# 生成包含Class和所有含(R)的列名列表 target_cols = ['Class'] + [col for col in df.columns if '(R)' in col] # 提取目标列 filtered_df = df[target_cols]
内容的提问来源于stack exchange,提问作者onexcent
相关产品推荐
相关产品推荐

