繁体   English   中英

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

[英]Creating dataframe and mapping nested dictionaries to key:value pairs

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

我想拿以下字典:

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”键进行映射。

感谢您的任何帮助!

我们可以用DataFrame.from_dict转换gasDict和列表理解purchaseDict 然后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

尝试:

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

基于@Henry Ecker 的回答的替代方案。 除了使用.explode ,您还可以构造一个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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM