将 pandas Dataframe 列映射到字典值

Posted

技术标签:

【中文标题】将 pandas Dataframe 列映射到字典值【英文标题】:map pandas Dataframe columns to dictionary values 【发布时间】: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,我以后会记住这一点,我是编码新手。 【参考方案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])

【讨论】:

以上是关于将 pandas Dataframe 列映射到字典值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:当字典中有多个键时,通过映射添加列

Pandas:通过从列表的字典映射创建一列

Pandas:根据另一列的键在现有列上映射字典值以替换 NaN

从两个熊猫系列(csv的列作为DataFrame)创建元素字典

映射 str.contains 跨 pandas DataFrame

Pandas Dataframe 将具有两个值的分类列重新映射为二进制