我正在尝试使用这种方法进行数据帧过滤
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中。
我尝试了几种方法(这是我的最新尝试),但似乎没有一种有效。这个返回错误: 生成器对象不可调用。
谢谢
答案 0 :(得分:1)
split
和explode
(要求熊猫0.25)字符串,然后检查any
列表中的isin
词l
(不需要长名称) )。
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))