我遇到了以下问题:
我想要下列字典:
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
来转换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
基于@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