将 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:根据另一列的键在现有列上映射字典值以替换 NaN
从两个熊猫系列(csv的列作为DataFrame)创建元素字典