将字典映射到数据框列中的列表
Map a dictionary to lists in dataframe column
给定一个包含 country
、topic
、industry
列的数据框,当列由列表组成时,我如何将字典映射到每一列?
例如,国家字典包含数百个国家和地区代码映射:
>> 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
个值,没有其他任何工作。
此外,如果可能的话,最终的数据帧非常大,所以速度很重要。
问题在于您的country
列是一系列列表,因此您需要遍历每个行列表中的元素,并将该元素用作cnt_dict
中的键。 @nidabdella 的评论就是这样做的。但是,列表不可散列,因此您应该得到 TypeError
而不是 None
...
@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]
给定一个包含 country
、topic
、industry
列的数据框,当列由列表组成时,我如何将字典映射到每一列?
例如,国家字典包含数百个国家和地区代码映射:
>> 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
个值,没有其他任何工作。
此外,如果可能的话,最终的数据帧非常大,所以速度很重要。
问题在于您的country
列是一系列列表,因此您需要遍历每个行列表中的元素,并将该元素用作cnt_dict
中的键。 @nidabdella 的评论就是这样做的。但是,列表不可散列,因此您应该得到 TypeError
而不是 None
...
@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]