gpt4 book ai didi

python - 忽略 DataFrame 上多个过滤器中的无效过滤器

转载 作者:行者123 更新时间:2023-12-04 14:58:17 24 4
gpt4 key购买 nike

问题陈述:

我有一个必须使用多个条件进行过滤的 DataFrame。

每个条件都是可选的,这意味着如果用户为某个条件输入了无效值,则可以完全跳过该条件,返回默认为原始 DataFrame(没有该特定条件)。

虽然我可以使用多个 if 条件很容易地实现这一点,以顺序方式修改 DataFrame,但我正在寻找更优雅和可扩展(增加输入参数)并且最好使用内置 pandas 功能的东西

可重现的例子

虚拟数据框-

df = pd.DataFrame({'One':['a','a','a','b'], 
'Two':['x','y','y','y'],
'Three':['l','m','m','l']})

print(df)
  One Two Three
0 a x l
1 a y m
2 a y m
3 b y l

假设无效值是不属于相应列的值。因此,对于“一”列,除“a”和“b”外,所有其他值均无效。如果用户输入 'a' 那么我应该能够过滤 DataFrame df[df['One']=='a'],但是,如果用户输入任何无效值,则不会这样应应用过滤器,并返回原始数据帧 df

我的尝试(有多个参数):

def valid_filtering(df, inp):
if inp[0] in df['One'].values:
df = df[df['One']==inp[0]]

if inp[1] in df['Two'].values:
df = df[df['Two']==inp[1]]

if inp[2] in df['Three'].values:
df = df[df['Three']==inp[2]]

return df

所有有效输入 -

inp = ['a','y','m']             #<- all filters valid so df is filtered before returning
print(valid_filtering(df, inp))
  One Two Three
1 a y m
2 a y m

几乎没有无效输入-

inp = ['a','NA','NA']           #<- only first filter is valid, so other 2 filters are ignored
print(valid_filtering(df, inp))
  One Two Three
0 a x l
1 a y m
2 a y m

P.S. 附加问题 - 有没有办法让 DataFrame 索引表现为 -

df[df['One']=='valid'] -> returns filtered df

df[df['One']=='invalid'] -> returns original df

因为这会帮助我重写我的过滤 -

df[(df['One']=='valid') & (df['Two']=='invalid') & (df['Three']=='valid')] -> Filtered by col One and Three

编辑:解决方案-

受@corralien 和@Ben.T 提供的代码和逻辑启发的更新解决方案

df.loc[(df.eq(inp)|~df.eq(inp).any(0)).all(1)]

最佳答案

这是一种根据每列中 inp 的每个值创建 bool 数据框的方法。然后沿行使用 any 以获得至少有一个 True 的列,并在选择至少有一个 True 的列后沿列使用 all

def valid_filtering(df, inp):
# check where inp values are same than in df
m = (df==pd.DataFrame(data=[inp] , index=df.index, columns=df.columns))
# select the columns with at least one True
cols = m.columns[m.any()]
# select the rows that all True amongst wanted columns
rows = m[cols].all(axis=1)
# return df with selected rows
return df.loc[rows]

请注意,如果您没有与原始 df 中的列相同数量的过滤器,那么您可以使用字典,它也可以像下面的示例一样工作,第三列将被忽略,因为所有 错误

d = {'One': 'a', 'Two': 'y'}
m = (df==pd.DataFrame(d, index=df.index).reindex(columns=df.columns))

关于python - 忽略 DataFrame 上多个过滤器中的无效过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67476889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com