如果列值中包含列表值,则在列上过滤数据框。熊猫

时间:2020-07-23 13:13:06

标签: python pandas string dataframe filter

如果列的值可以在列表中找到,我对过滤数据框很熟悉,但是我无法弄清楚如何实现相反的情况,请遍历列表中的值以查看是否包含这些值在列值中。

例如,我的df中有一列,其值如下:

df = pd.DataFrame({'column':['abc', 'def', 'ghi', 'abc, def', 'ghi, jkl', 'abc']})


     column
0       abc
1       def
2       ghi
3  abc, def
4  ghi, jkl
5       abc

请注意,所有值都是字符串,包括'abc, def'

之类的值

我还有一个要过滤的两个值的列表:filter_list = ['abc', 'jkl'],以便将这些值保留在df列中找到的位置。

如果列表中的值包含在列中,我想过滤数据框列,以使这种情况下的最终输出为'column' = ['abc', 'abc, def', 'ghi, jkl', 'abc']

     column
0       abc
1  abc, def
2  ghi, jkl
3       abc

我要保留包含“ abc” /“ jkl”的行。

我的第一个想法是在lambda函数中使用列表理解,但这会引发错误:

dataframe = dataframe[dataframe['column'].apply(labmda x: f for f in filter_list in x])]

请注意,我无法使用.isin()方法,因为它无法捕获像'abc, def'这样的复杂字符串

寻找有关如何执行此操作的想法。我不能使用re包装。我只能访问pandas / numpy。

更新:

非常感谢Balaji!工作解决方案:

保留列表值:

dataframe[pd.notna(dataframe[column]) & dataframe[column].astype(str).str.contains('|'.join(filter_list))]

过滤:

dataframe[pd.notna(dataframe[column]) & ~dataframe[column].astype(str).str.contains('|'.join(filter_list))]

2 个答案:

答案 0 :(得分:1)

您在这里:

df = pd.DataFrame({'column':['abc', 'def', 'ghi', 'abc, def', 'ghi, jkl', 'abc']})
contains_filter = '|'.join(filter_list)
df = df[pd.notna(df.column) & df.column.str.contains(contains_filter)]

输出:

     column
0       abc
3  abc, def
4  ghi, jkl
5       abc

答案 1 :(得分:0)

str,contains是通常的处理方式,但让我们看看另一种方法。如果您的字符串列用逗号分隔,我们可以使用.stackisin

filter_list = ['abc', 'jkl']

s = df['column'].str.split(',',expand=True).stack().str.strip()

df_filter = df.loc[s[s.isin(filter_list)].index.get_level_values(0)]

print(df_filter)

     column
0       abc
3  abc, def
4  ghi, jkl
5       abc