条件过滤(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
我有一个包含多个字符串的数组,其中一些是 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