将具有多个键的 Python 字典映射到具有多个匹配键的列的数据框中

Posted

技术标签:

【中文标题】将具有多个键的 Python 字典映射到具有多个匹配键的列的数据框中【英文标题】:Mapping Python dictionary with multiple keys into dataframe with multiple columns matching keys 【发布时间】:2018-11-10 21:49:43 【问题描述】:

我有一个字典,我想映射到当前数据框并创建一个新列。我在一个元组中有键,它们映射到我的数据框中的两个不同列。

dct = ('County', 'State'):'CountyType'
df = pd.DataFrame(data=['County','State'])

我想创建一个新列CountyType,使用dict 映射到df 中的两列。但是,执行以下操作会给我一个错误。这还能怎么做?

df['CountyType'] = (list(zip(df.County,df.State)))
df = df.replace('CountyType': county_type_dict)

【问题讨论】:

不要命名字典 dict,它会覆盖内置名称 我很好奇如何创建元组字典。它类似于 jpp 的答案。 yourdict = df.set_index(['County','State'])['CountyType'].to_dict() 也可以在这里阅读更多内容:***.com/questions/42276588/… 【参考方案1】:

如果您有以下字典,其中元组作为键,DataFrame 具有对应于元组值的列

import pandas as pd
dct = ('A', 1): 'One', ('B', 2): 'Two', ('B', 3): 'Three'
df = pd.DataFrame('County': ['A', 'A', 'B', 'B', 'B'],
                   'State': [1, 2, 1, 2, 3])

您可以从 df 创建元组的 Series,然后使用 .map()

df['CountyType'] = pd.Series(list(zip(df.County, df.State))).map(dct)

结果

  County  State CountyType
0      A      1        One
1      A      2        NaN
2      B      1        NaN
3      B      2        Two
4      B      3      Three

【讨论】:

你能用这个只填nan吗?我尝试使用 pd.Series.fillna(),但不起作用。【参考方案2】:

您可以从两个系列中创建一个MultiIndex,然后进行映射。来自@ALollz 的数据。

df['CountyType'] = df.set_index(['County', 'State']).index.map(dct.get)

print(df)

  County  State CountyType
0      A      1        One
1      A      2       None
2      B      1       None
3      B      2        Two
4      B      3      Three

【讨论】:

AttributeError: 'DataFrame' object has no attribute 'map' 你如何克服这个问题? 你必须使用index属性。即df.index.map,而不是df.map 谢谢。如何使用此行仅填写“县类型”中的 nans? @FaaizQadri,不确定 - 这将是一个新问题。

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

将pandas数据帧转换为具有多个键的字典

一个类应该有多个属性或一个属性作为具有许多键的字典,Python3

创建和查找每个值具有多个键的 2D 字典

具有相同键的多个条目的字典[重复]

C#如何创建具有多个相同键的字典? [复制]

如何合并具有相同键或不同键的多个字典?