将字典映射到数据框列中的列表

Posted

技术标签:

【中文标题】将字典映射到数据框列中的列表【英文标题】:Map a dictionary to lists in dataframe column 【发布时间】:2021-07-14 01:13:01 【问题描述】:

给定一个包含countrytopicindustry 列的数据框,当列由列表组成时,我如何将字典映射到每一列?

例如,国家/地区的字典包含数百个国家和地区代码的映射:

>> cnt_dict = 'AARCT': 'ANTARTICA', 'ABDBI': 'ABU DHABI', 'AFGH': 'AFGHANISTAN' ... 'ZAIRE': 'DEMOCRATIC REPUBLIC OF THE CONGO', 'ZAMBIA': 'ZAMBIA', 'ZIMBAB': 'ZIMBABWE'

df 对应的一列是国家代码列表:

>>df['country'].head(5)
country
[ANDO, COOKIS, INDOCH]
[IRAN]
[MALAG, BERM, WESTW, USAWI]
[]
[ECU, FALK, OMAN]

我如何将 cnt_dic 映射到 df['country'] 以将每个列表中的每个值转换为其映射的字典值,以便输出将是(使用伪代码):

>> df['country'] = df['country'].map(cnt_dic to lists)
>> df['country'].head(5)
country
[ANDORRA, COOK ISLANDS, INDO-CHINA]
[IRAN]
[MADAGASCAR, BERMUDA, WESTERN WORLD, UNITED STATES WISCONSIN]
[]
[ECUADOR, FALKLAND ISLANDS, OMAN]

我尝试了df['country'] = df['country'].apply(lambda x: list(map(lambda y:cnt_dic.get(y, None), x))),但我只在所有列表中获得了None 值,并且没有其他任何工作。

另外,如果可能的话,最终的数据帧非常大,所以速度很重要。

【问题讨论】:

你试过df['country'] = df['country'].apply(lambda x: [cnt_dict.get(i) for i in x]) 【参考方案1】:

@trianta2 @DrakeMurdoch 只是为了确保我尝试制作一个示例,并且它工作正常

import pandas as pd
df = pd.DataFrame('d': [['A', 'B'], ['B', 'C'], ['A']])
df
        d
0  [A, B]
1  [B, C]
2     [A]
d = 'A':2, 'B':0, 'C':4
df['k'] = df['d'].apply(lambda x: [d[i] for i in x])

#output
df
        d       k
0  [A, B]  [2, 0]
1  [B, C]  [0, 4]
2     [A]     [2]

【讨论】:

所以,出于某种原因,当我这样做时,它只填写列表中的第一个值,其余的保留为None。你知道为什么会这样吗?例如:['ARGENTINA', None, None] 我能想到的唯一原因是你的字典没有正确的键,你能仔细检查一下吗? 好的,我发现了一些搞砸了的空格。但现在它完美地工作了!谢谢!【参考方案2】:

问题是您的country 列是一系列列表,因此您需要遍历每个行列表中的元素,并将该元素用作cnt_dict 中的键。 @nidabdella 的评论就是这样做的。但是,列表不可散列,因此您应该得到 TypeError 而不是 None...

【讨论】:

即使我使用@nidabella 的想法,我仍然在我的所有列表中得到None

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

将数据框列中的值附加到列表

将数据框列中的列表拆分为多列[重复]

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

根据字典替换数据框列中的值不起作用[重复]

循环遍历 pandas 数据框列中的列表元素以在新列中返回列表

通过按 python 中数据框列中的值分组来创建字典