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



我遇到了以下问题:

我想要下列字典:

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的相应"购买"密钥映射。

感谢您的帮助!

尝试:

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

我们可以使用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

基于@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

最新更新