提问人:Big_Soup 提问时间:5/3/2023 最后编辑:Big_Soup 更新时间:5/3/2023 访问量:22
通过将现有列与字典键元组索引匹配,并从嵌套字典中获取值,在 pandas df 中创建新列
Creating a new column in a pandas df by matching an existing column to a dictionary key tuple index, and taking a value from a nested dictionary
问:
假设我有一只熊猫狗,需要将它们与它们的字典相匹配,它们的主人从 XML 文件中读取。
狗DF
狗名 | 狗的种类 |
---|---|
拉里 | 施氏 |
雪 莉 | 黑色实验室 |
科达 | 沙哑 |
dogOwners = {('Larry', 'Shihtzu') : {'体重(磅)' : 15, '主人' : 'Shawn' '药物(每天)' : 2}, ('雪莉', '黑色实验室') : {'体重(磅)' : 67, '主人' : '马克'}, ('科达', '赫斯基') : {'体重(磅)' : 82, '主人' : '劳拉', '药物(每天)' : 1}}
狗DF
狗名 | 狗的种类 | 所有者 |
---|---|---|
拉里 | 施氏 | 肖恩 |
雪 莉 | 黑色实验室 | 马克 |
科达 | 沙哑 | 劳 拉 |
如果词典的格式应该改变,我愿意接受建议。感谢您的帮助!
我已经试过了: dogsDF['所有者'] = dogsDF['狗名'].apply(lambda x : dogOwners.get(x)).fillna('')
答:
0赞
mozway
5/3/2023
#1
您可以借助json_normalize
将您的词典转换为,然后合并
:DataFrame
tmp = (pd.json_normalize(dogOwners.values())
.set_axis(dogOwners.keys())
.rename_axis(['Dog Name', 'Dog Type'])
)
out = pd.merge(df, tmp, on=['Dog Name', 'Dog Type'])
输出:
Dog Name Dog Type Weight(lbs) Owner Medication(per day)
0 Larry Shihtzu 15 Shawn 2.0
1 Shelly Black Lab 67 Mark NaN
2 Koda Husky 82 Laura 1.0
您可以筛选要使用的列:
out = pd.merge(df, tmp[['Owner']], on=['Dog Name', 'Dog Type'])
输出:
Dog Name Dog Type Owner
0 Larry Shihtzu Shawn
1 Shelly Black Lab Mark
2 Koda Husky Laura
更好的数据格式可能是字典列表:
lst = [{'Dog Name': 'Larry', 'Dog Type': 'Shihtzu', 'Weight(lbs)': 15, 'Owner': 'Shawn', 'Medication(per day)': 2.0},
{'Dog Name': 'Shelly', 'Dog Type': 'Black Lab', 'Weight(lbs)': 67, 'Owner': 'Mark'},
{'Dog Name': 'Koda', 'Dog Type': 'Husky', 'Weight(lbs)': 82, 'Owner': 'Laura', 'Medication(per day)': 1.0},
]
tmp = pd.DataFrame(lst)
0赞
Vincent Rupp
5/3/2023
#2
该代码不起作用,因为您的字典键是狗的名称和类型。然后“Owner”是该字典的键,但您可以使用当前的字典结构完成您想要的东西。dogOwners.get(x)
可重现的例子:
dogOwners = {('Larry', 'Shihtzu') : {'Weight(lbs)' : 15, 'Owner' : 'Shawn', 'Medication(per day)' : 2}, ('Shelly', 'Black Lab') : {'Weight(lbs)' : 67, 'Owner' : 'Mark'}, ('Koda', 'Husky') : {'Weight(lbs)' : 82, 'Owner' : 'Laura', 'Medication(per day)' : 1}}
dogsdict = {'Dog Name':['Larry', 'Shelly', 'Koda'], 'Dog Type':['Shihtzu', 'Black Lab', 'Husky']}
dogsDF = pd.DataFrame(dogsdict)
dogsDF['Owner'] = dogsDF.apply(lambda row: dogOwners.get((row["Dog Name"], row["Dog Type"]),"")['Owner'], axis=1)
顺便说一句,如果键不存在,第二个参数将自动返回 “”,因此您可以跳过.get()
.fillna()
希望对您有所帮助!
评论