我有多个列的df,例如MLB,NBA,NHL,NFL,TESTNBA,我想返回一个列表,其中列中包含字符串MLB或NBA。如下所示:
df_check = ['MLB', 'NBA', 'TESTNBA']
value_cols = [col for col in df.columns if df_check in col]
以上操作失败,并出现以下错误:
TypeError:“ in”要求将字符串作为左操作数,而不是列表
是否可以通过多个值过滤列?
答案 0 :(得分:1)
您可以使用pandas.DataFrame.filter
:
设置
df = pd.DataFrame(columns=['MLB', 'NBA', 'NHL', 'NFL', 'TESTNBA'])
df_check = ['MLB', 'NBA']
df.filter(regex='|'.join(df_check)).columns
Index(['MLB', 'NBA', 'TESTNBA'], dtype='object')
答案 1 :(得分:0)
in
运算符不能以矢量化方式工作。根据您的逻辑,您需要将any
与生成器表达式结合使用:
value_cols = [col for col in df.columns if any(i in col for i in df_check)]
更好的是,您可以将布尔索引用于str.contains
。这是一个演示:
df = pd.DataFrame(columns=['MLB1', 'NBA2', 'SOMEOTHERCOL', 'TESTNBA3', 'MLB4'])
df_check = ['MLB', 'NBA', 'TESTNBA']
value_cols = df.columns[df.columns.str.contains('|'.join(df_check))]
Index(['MLB1', 'NBA2', 'TESTNBA3', 'MLB4'], dtype='object')