在列表所有 pandas 列中搜索词

search word in list all pandas columns

下面是我的DF

df = pd.DataFrame({'a' : ['NYC', 'NYC', 'Boston', 'LA', 'SF', 'NYC'], 'b' : ['Other', 'Other', 'NY', 'NUI', 'SD', 'SF']})

    a   b
0   NYC Other
1   NYC Other
2   Boston  NY
3   LA  NUI
4   SF  SD
5   NYC SF

目的是检查单词列表是否在 df 中

下面是检查特定单词的代码

word = 'SF'
mask = np.column_stack([df[col].str.contains(word, na=False) for col in df])
df.loc[mask.any(axis=1)]


a   b
4   SF  SD
5   NYC SF

如何使用列表而不是一个字符串执行此操作?

word = ['SF', 'NY']

您可以从条款中形成一个正则表达式替换并使用它:

word = ['SF', 'NY']
regex = r'^(?:' + r'|'.join(word) + ')$'
mask = np.column_stack([df[col].str.contains(regex, na=False) for col in df])
df.loc[mask.any(axis=1)]

如果你想匹配精确的词,使用isin combined with any:

word = ['SF', 'NY']

df[df.isin(word).any(1)]

输出:

        a   b
2  Boston  NY
4      SF  SD
5     NYC  SF

中间体:

df.isin(word)

       a      b
0  False  False
1  False  False
2  False   True
3  False  False
4   True  False
5  False   True

df.isin(word).any(1)

0    False
1    False
2     True
3    False
4     True
5     True
dtype: bool

对于正则表达式匹配合并 apply and str.contains:

word = ['SF', 'NY']
regex = '|'.join(word)
df[df.apply(lambda c: c.str.contains(regex)).any(1)]

输出:

        a      b
0     NYC  Other
1     NYC  Other
2  Boston     NY
4      SF     SD
5     NYC     SF