基于字符串列表中包含连接字符串的pandas字段进行熊猫过滤

时间:2019-08-21 19:48:38

标签: python pandas

我正在尝试使用这种方法进行数据帧过滤

reduced_df = full_df[(full_df['field1'] == some_defined_value1) & \
                     (full_df['field2'] == some_defined_value2) & \
                     (full_df['field3'].apply(lambda x: x for x in ','.join(list_of_comma_separated_string))) & \
                     (full_df['field4'].apply(lambda x: x for x in ','.join(list_of_comma_separated_string)))]

我被卡在.apply部分。我想做的是如果field3值在字符串列表中,则进入该行。例如:

如果使用

field3 = 'apples,oranges,bananas'  # please note it is a single string

我有一个

list_of_comma_separated_string = ['apples', 'oranges', 'bananas', 'grapes', 'peaches']

然后该行应包含在reduce_df中。但是,如果

field3 = 'melons,avacado,mint' 

然后该行不应包含在reduce_df中。

我尝试了几种方法(这是我的最新尝试),但似乎没有一种有效。这个返回错误: 生成器对象不可调用。

谢谢

1 个答案:

答案 0 :(得分:1)

splitexplode(要求熊猫0.25)字符串,然后检查any列表中的isinl(不需要长名称) )。

df['field3'].str.split(',').explode().isin(l).any(level=0)

示例:

import pandas as pd
df = pd.DataFrame({'field1': [1, 1, 2],
                   'field2': [7, 8, 5],
                   'field3': ['apples,oranges,bananas', 'melons,avacado,mint',
                              'crabapples,foo']})
l = ['apples', 'oranges', 'bananas', 'grapes', 'peaches']

df['field3'].str.split(',').explode().isin(l).any(level=0)
#0     True
#1    False
#2    False
#Name: field3, dtype: bool

然后您将条件写为:

m = (df['field1'].eq(some_val1) 
     & df['field2'].eq(some_val2) 
     & df['field3'].str.split(',').explode().isin(l).any(level=0)
     & df['field4'].str.split(',').explode().isin(l).any(level=0))