如果列的值可以在列表中找到,我对过滤数据框很熟悉,但是我无法弄清楚如何实现相反的情况,请遍历列表中的值以查看是否包含这些值在列值中。
例如,我的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))]
答案 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
是通常的处理方式,但让我们看看另一种方法。如果您的字符串列用逗号分隔,我们可以使用.stack
和isin
。
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