我想使用“ commands”字符串来自动进行一些熊猫df分析。
类似:
str_a = 'df.col_1.isna()'
str_b = ' & '
str_c = 'df.col_2.isna()'
str_tot = str_a + str_b + str_c
然后使用该字符串对df中的NaN行进行排序:
df.loc[str_tot, :]
最后一个应该等于:
df.loc[df.col_1.isna() & df.col_2.isna(), :]
但是python编译器将str_tot作为[列表]而不是字符串读取,返回错误。
有办法避免这种情况吗?
非常感谢
我在VBA中已经很习惯于构建SQL字符串...对于python来说这是一个错误的主意吗?
答案 0 :(得分:3)
关闭,您需要的是DataFrame.query
,但是如果需要使用Series.isna
函数,请添加参数engine='python'
:
df = pd.DataFrame({
'A':list('abcdef'),
'col_1':[np.nan,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'col_2':[np.nan,3,5,7,1,np.nan],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')
})
print (df)
A col_1 C col_2 E F
0 a NaN 7 NaN 5 a
1 b 5.0 8 3.0 3 a
2 c 4.0 9 5.0 6 a
3 d 5.0 4 7.0 9 b
4 e 5.0 2 1.0 2 b
5 f 4.0 3 NaN 4 b
str_a = 'col_1.isna()'
str_b = ' & '
str_c = 'col_2.isna()'
str_tot = str_a + str_b + str_c
print (str_tot)
col_1.isna() & col_2.isna()
print (df.query(str_tot, engine='python'))
A col_1 C col_2 E F
0 a NaN 7 NaN 5 a
另一个想法是使用事实np.nan == np.nan
是False
,docs:
str_a = '(col_1 != col_1)'
str_b = ' & '
str_c = '(col_2 != col_2)'
str_tot = str_a + str_b + str_c
print (str_tot)
(col_1 != col_1) & (col_2 != col_2)
print (df.query(str_tot))
A col_1 C col_2 E F
0 a NaN 7 NaN 5 a
答案 1 :(得分:0)
您可以使用python (number_of_samples, 784)
的替代方式。
eval
对于上例:
str_a = 'df.col_1.isna()'
e = eval(str_a)
print(e)
会回来
df = pd.DataFrame({
'A':list('abcdef'),
'col_1':[np.nan,5,4,5,5,4],
'C':[7,8,9,4,2,3],
'col_2':[np.nan,3,5,7,1,np.nan],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')
})
print (df)
A col_1 C col_2 E F
0 a NaN 7 NaN 5 a
1 b 5.0 8 3.0 3 a
2 c 4.0 9 5.0 6 a
3 d 5.0 4 7.0 9 b
4 e 5.0 2 1.0 2 b
5 f 4.0 3 NaN 4 b