【问题标题】:map pandas Dataframe columns to dictionary values将 pandas Dataframe 列映射到字典值
【发布时间】:2016-09-02 03:31:21
【问题描述】:

我有一本 one:many 字典。我想将 pandas Dataframe 列的值映射到字典的键(不是值)。这是我的字典:

dict1={'fruits':('apple','grapes','oranges'),'food':('fish','meat','fibre')}

这里是熊猫系列对象:

df=pd.Series(['fish','apple','meat'])

我想要的输出:

0      food
1    fruits
2      food
dtype: object

【问题讨论】:

  • 你做错了。你的数据结构是错误的。字典用于正向查找,而不是反向查找。最重要的是,您正在对元组进行反向查找,这意味着您有O(n*m) 时间复杂度,其中n 是字典中的键数,m 是每个元组的平均大小。您应该有一个字典,然后将每种类型的食物映射到一个类别,因此{'fish': 'food', 'appl'e:'fruits'},您的查找具有O(1) 时间复杂度。
  • 感谢您的 cmets,我以后会记住这一点,我是编码新手。

标签: python dictionary pandas dataframe


【解决方案1】:

如果“水果”和“食物”中都有“其他”怎么办?这就是为什么如果没有某种逻辑来解决重复项就无法进行反向查找。

如果您的值都是唯一的,那么您可以使用字典理解来反转您的字典:

reversed_dict = {val: key for key in dict1 for val in dict1[key]}

>>> reversed_dict
{'apple': 'fruits',
 'fibre': 'food',
 'fish': 'food',
 'grapes': 'fruits',
 'meat': 'food',
 'oranges': 'fruits'}

然后你就可以映射了。

>>> pd.Series(['fish','apple','meat']).map(reversed_dict)
0      food
1    fruits
2      food
dtype: object

【讨论】:

  • 它有效。我确实明白:这不是最佳的编码方式,并且会重做我的数据结构。感谢您指出这一点。
【解决方案2】:

解决方案

df.apply(lambda x: [k for k in dict1 if x in dict1[k]][0])

【讨论】:

    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 2021-08-04
    • 2020-09-01
    • 1970-01-01
    • 2015-07-24
    • 2021-11-25
    • 2021-08-31
    • 2018-09-21
    相关资源
    最近更新 更多