【问题标题】:how to concatenate / use strings to execute commands in python / pandas如何连接/使用字符串在python / pandas中执行命令
【发布时间】:2019-10-01 02:36:29
【问题描述】:

我想使用“命令”字符串来自动化一些 pandas 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 读取为 [list] 而不是字符串,返回错误。

有没有办法绕过这个?


非常感谢

我已经习惯了在 VBA 中构建 SQL 字符串...在 python 中这是一个错误的想法吗?

【问题讨论】:

  • 请问是什么原因造成如此不正统的设计?字符串从哪里来?它们是用户输入的、从文件中读取的还是其他的?
  • 你可以看看eval(),但它可能是适合这项工作的错误工具
  • 嗨 DYZ,这只是为了在我的数据分析中建立一点自动化......我在一侧构建字符串,然后我提供了一个小函数......你为什么说这是非正统的吗?什么是“正统”?非常感谢

标签: python string pandas concatenation


【解决方案1】:

您可以使用 python 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

会回来

0     True
1    False
2    False
3    False
4    False
5    False

【讨论】:

  • 我应该删除帖子然后@BusinessExploration?
  • 不,请,它添加了上下文。 eval 和 exec 我在寻找解决方案时碰到的东西......
【解决方案2】:

关闭,你需要的是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

【讨论】:

  • 非常感谢。这与我想要的很接近。想知道是否有更通用的功能。我的只是一个例子:我正在寻找一个更复杂的字符串。另外:这适用于查询行,列呢?即假设我想在某些行上定位一个 df (现在我知道该怎么做,thx )以将值更改为已定义列的单元格。有没有办法“查询”选择列( ? df[col_x].query(string)= '123' ? ) THX 很多 -
  • @BusinessExploration - 不容易,你需要什么。也许你可以检查this,但通常一些通用的解决方案可能是可能的,但真的很复杂。
  • jezrael... 非常感谢,我认为您指出了正确的方向。我简要介绍了您提供的链接,并且概念就在那里……即使我很惊讶看到如此多的信息。使用字符串构建查询这是 VBA 中的正常做法(DoCmd.RunSQL)...我需要学习...
  • @BusinessExploration - 是的,每种语言都有点不同。 :)
猜你喜欢
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多