【问题标题】:Using MySQL like conditions when querying pandas dataframe column values查询 pandas 数据框列值时使用类似 MySQL 的条件
【发布时间】:2017-08-29 21:01:40
【问题描述】:

我正在尝试选择标签包含某个字符串的 pandas 数据框中的所有项目:

df.query(' ITEM in @label.keys() and "H2O" in @label[ITEM]')

label 是将项目映射到其文本标签的字典。

但是当我这样做时,我得到:

TypeError: 'Series' 对象是可变的,因此它们不能被散列

我知道解决此问题的一种方法是创建另一个字典,其中包含标签中包含“H2O”的项目,我们称之为 label_H2O,然后查询可以变为:

df.query(' ITEM in @label_H2O.keys()')

但是第一种方法更方便,因为我可以在一个查询中完成所有操作。

是否可以像我在第一种方法中尝试的那样在单个查询中执行此操作?另外,如果有办法,它会比第二种方法慢吗?

我不确定表达式是如何计算的,我能想到两种可能性:

  1. 遍历整个数据框并获取所有唯一项 -> 过滤器 它们基于附加条件 -> 将它们存储在一个集合中 -> 遍历数据框中的每一行并检查项目是否在此集合中并相应地选择行
  2. 遍历每一行并评估条件

在情况 1 中,两个查询似乎应该具有相似的性能。在情况 2 中,第二个查询效率更高,尤其是在我们有很多重复项的情况下。

df 标头:

   SUBJECT_ID  ITEM
0           1     3
1           2     5
2           1     5
3           1     2
4           1     2

标签:

{
 1: 'Coffee',
 2: 'Apple Juice',
 3: 'Soda',
 4: 'Tea',
 5: 'Sparkling H2O'
}

【问题讨论】:

  • 你能发布你的 df.head() 吗?
  • @Ibrahim,你能否提供一个代表label的样本数据集?
  • @MaxU 我更新了问题以包含示例字典
  • @Vaishali 添加了示例标题并更改了值以进一步说明案例

标签: python mysql pandas


【解决方案1】:

我不确定您的问题是否是为了获得结果,或者您是否同意使用query 的想法,只是好奇如何让它发挥作用。

如果您只是在寻找一种方法来从 df 获取键对应于其中包含“H2O”的标签的行:

df[df['item'].isin([k for k,v in label.items() if 'H2O' in v])]

【讨论】:

  • 我赞同使用查询的想法,因为它似乎可以从两个世界(MySQL 和 Python)中受益。我也有兴趣知道表达式的评估顺序,因为我大部分时间都在处理大数据并且需要尽可能优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2021-09-06
  • 2021-04-22
  • 2020-12-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多