熊猫:在query()中,如何查找列值作为dict键?

时间:2018-10-08 18:26:43

标签: python pandas

在我的Pandas query()中,我想根据一个字段是否在另一个字段的dict查询中找到的集合中进行过滤。这是一些简化的代码,说明了我的问题:

import pandas

cars = {
    'Japan': {'Honda', 'Nissan', 'Toyota'},
    'USA': {'Ford', 'Chevrolet', 'Tesla'},
}

data = pandas.DataFrame({
    'country': ['Japan', 'Japan', 'USA'],
    'make': ['Honda', 'Ford', 'Ford'],
    'date': ['2018-10-04', '2018-10-05', '2018-10-06'],
}).astype(dtype={'country': 'category', 'make': 'category', 'date': 'category'})

print data.query('make in @cars[country]')

我只想包括在基于另一字段(make)的字典查找中找到的集合中存在一个字段(@cars[country])的行。

预期

  country        date   make
0   Japan  2018-10-04  Honda
1     USA  2018-10-06   Ford

实际

TypeError: 'Series' objects are mutable, thus they cannot be hashed

任何人都知道如何进行这项工作吗?还是我需要为此使用apply(据我了解比较慢)?

1 个答案:

答案 0 :(得分:1)

首先,我不确定在不使用apply的情况下如何进行字典查找(这可能很慢,因为它没有利用向量化的优势)。

但是,关于您的问题

  

我需要诉诸于此吗?

肯定有比应用更好的选择。例如,This post建议使用pandas.merge,该速度比应用更快。

In [29]: carsdf = pd.DataFrame({'country':["Japan"]*3+["USA"]*3, 'make':['Nissan','Honda','Toyota','Tesla','Chevolet','Ford']})

In [30]: pd.merge(data, carsdf, how='inner')
Out[28]: Out[30]: 
  country        date   make
0   Japan  2018-10-04  Honda
1     USA  2018-10-06   Ford