基于OR条件选择DataFrame列的最优实现方法
可行实现方案
1. 优先匹配第一个存在的列(完全匹配or逻辑)
和你理想中的df['r' or 'radius']逻辑完全一致,按顺序判断候选列,取第一个存在的列:
df[next(col for col in ['r', 'radius', 'Radius[m]'] if col in df.columns)]
2. 筛选所有符合条件的列
如果需要把当前DataFrame内所有对应物理量的别名列都筛选出来,用pandas内置的filter方法更简洁:
精确匹配指定别名
df.filter(items=['r', 'radius', 'Radius[m]'], axis=1)
模糊匹配(不用穷举所有别名)
如果别名有规律(比如允许带单位后缀、大小写不敏感),可以用正则匹配,减少别名枚举量:
# 匹配r、radius、Radius[m]、r[mm]等格式的列名 df.filter(regex=r'^(r|radius)(\[[a-zA-Z]+\])?$', axis=1, case=False)
如果筛选后只有1列,想要和直接取列的效果一致返回Series,在末尾添加.squeeze('columns')即可:
df.filter(items=['r', 'radius'], axis=1).squeeze('columns')
3. 封装成工具函数(使用体验最接近理想写法)
如果需要频繁做该操作,封装后调用的语法几乎和你设想的完全一致:
def get_phy_col(df, *aliases): return df[next(col for col in aliases if col in df.columns)] # 调用示例 get_phy_col(df, 'r', 'radius')
内容的提问来源于stack exchange,提问作者NickOTeen
相关产品推荐
相关产品推荐

