如何连接/使用字符串在python / pandas中执行命令

时间:2019-05-14 06:19:01

标签: python string pandas concatenation

我想使用“ 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来说这是一个错误的主意吗?

2 个答案:

答案 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.nanFalsedocs

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