条件过滤(pandas)

Filtering with conditional conditions (pandas)

我有一个包含多个字符串的数组,其中一些是 none(0 或 ''),并且每个字符串都应该有自己的条件 if exists .如果其位置的数组是 none,我不必应用过滤。

# df.columns = ['a','b','c','d','e']

# Case 1 
l = ['A', 'B', '','' , 123]
## DESIRED FILTERING
df[ (df.a=='A') & (df.b=='B') & (df.e == 123)]

# Case 2
l = ['z','' ,'' ,'', 123]
## DESIRED FILTERING
df[ (df.a=='z') & (df.e == 123) ]

这是我的尝试,但失败了,因为 (df.col_name == 'something') returns 一系列。

#Case 1 for example

check_null = [ i!='' for i in l ]       # ->returns [true,false,...]
conditions = [ (df.a==l[0]),(df.b==l[1]),(df.c==l[2]), (df.d==l[3]), (df.e==l[4])]
filt = [conditions[i] for i in range(len(check_null)) if check_null[i]]

df[filt]

我如何设法完成这项工作?

为非空值创建字典,转换为 Series 并在 boolean indexing 中过滤:

df = pd.DataFrame(columns = ['a','b','c','d','e'])
df.loc[0] = ['A', 'B','g' ,'h' , 123]
df.loc[1] = ['A', 'B','g' ,'h' , 52]

l = ['A', 'B','' ,'' , 123]

s = pd.Series(dict(zip(df.columns, l))).loc[lambda x: x != '']

df  = df[df[s.index].eq(s).all(axis=1)]
print (df)
   a  b  c  d    e
0  A  B  g  h  123

l = ['A', 'B', '','', '']
s = pd.Series(dict(zip(df.columns, l))).loc[lambda x: x != '']

df  = df[df[s.index].eq(s).all(axis=1)]
print (df)
   a  b  c  d    e
0  A  B  g  h  123
1  A  B  g  h   52

您可以使用系列进行比较。

确保该值与系列匹配 (df.eq(s)),或者 (|) 系列包含空字符串 (s.eq(''))。广播魔术将完成剩下的工作 ;)

s = pd.Series(l, index=df.columns)

df2 = df[(df.eq(s)|s.eq('')).all(1)]

示例['A', 'B', '', '', 123]

# input
   a  b  c  d    e
0  A  B  C  D  123
1  A  X  C  D  456

# output
   a  b  c  d    e
0  A  B  C  D  123