创建数据框并将嵌套字典映射到键:值对

时间:2021-07-23 17:15:35

标签: python pandas dataframe

我有点被以下问题困住了:

我想使用以下词典:

gasDict ={'Chair': {'CO2': 0.4, 'Methane': 0.5, 'Other': 0.6},'House': {'CO2': 0.4, 'Methane': 0.2, 'Other': 0.3}}
purchaseDict = {'Bob': ['Chair', 'House'], 'Jim': ['Chair']}

并创建以下数据框:

| Name | Purchase| CO2   | Methane |Other |
|:---- |:-------:|:-----:|:-------:|-----:|
| Bob  | Chair   | 0.4   |  0.5    | 0.6  |
| Bob  | House   | 0.4   |  0.2    | 0.3  | 
| Jim  | Chair   | 0.4   |  0.5    | 0.6  | 

我的两个挑战是 1) 为对应的值列表项的 # 创建一个具有重复名称的名称列;和 2) 将三个 gasDict 嵌套键:值对与来自 purchaseDict 的相应“purchase”键进行映射。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

我们可以使用 DataFrame.from_dict 来转换 gasDictpurchaseDict 的列表推导式。然后join一起:

gasDict = {'Chair': {'CO2': 0.4, 'Methane': 0.5, 'Other': 0.6},
           'House': {'CO2': 0.4, 'Methane': 0.2, 'Other': 0.3}}

purchaseDict = {'Bob': ['Chair', 'House'], 'Jim': ['Chair']}

df_gas = pd.DataFrame.from_dict(gasDict, orient='index')
df_purchase = pd.DataFrame([(k, v)
                            for k, lst in purchaseDict.items() for v in lst],
                           columns=['Name', 'Purchase'])
df = df_purchase.join(df_gas, on='Purchase')

df

  Name Purchase  CO2  Methane  Other
0  Bob    Chair  0.4      0.5    0.6
1  Bob    House  0.4      0.2    0.3
2  Jim    Chair  0.4      0.5    0.6

答案 1 :(得分:3)

试试:

gasDict = {
    "Chair": {"CO2": 0.4, "Methane": 0.5, "Other": 0.6},
    "House": {"CO2": 0.4, "Methane": 0.2, "Other": 0.3},
}

purchaseDict = {"Bob": ["Chair", "House"], "Jim": ["Chair"]}

df = pd.DataFrame(
    {"Name": k, "Purchase": vv, **gasDict[vv]}
    for k, v in purchaseDict.items()
    for vv in v
)
print(df)

打印:

  Name Purchase  CO2  Methane  Other
0  Bob    Chair  0.4      0.5    0.6
1  Bob    House  0.4      0.2    0.3
2  Jim    Chair  0.4      0.5    0.6

答案 2 :(得分:0)

基于@Henry Ecker 的回答的替代方案。除了使用推导式,您还可以构造一个 DataFrame 并使用 .explode

gasDict = {
    "Chair": {"CO2": 0.4, "Methane": 0.5, "Other": 0.6},
    "House": {"CO2": 0.4, "Methane": 0.2, "Other": 0.3},
}

purchaseDict = {"Bob": ["Chair", "House"], "Jim": ["Chair"]}


df_gas = pd.DataFrame.from_dict(gasDict, orient="index")
df_purchase = (
    pd.DataFrame(purchaseDict.items(), columns=["Name", "Purchase"])
    .explode("Purchase")
)

out = df_purchase.join(df_gas, on='Purchase').reset_index()

print(out)
  Name Purchase  CO2  Methane  Other
0  Bob    Chair  0.4      0.5    0.6
1  Bob    House  0.4      0.2    0.3
2  Jim    Chair  0.4      0.5    0.6
相关问题