通过将现有列与字典键元组索引匹配,并从嵌套字典中获取值,在 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

提问人:Big_Soup 提问时间:5/3/2023 最后编辑:Big_Soup 更新时间:5/3/2023 访问量:22

问:

假设我有一只熊猫狗,需要将它们与它们的字典相匹配,它们的主人从 XML 文件中读取。

狗DF

狗名 狗的种类
拉里 施氏
雪 莉 黑色实验室
科达 沙哑

dogOwners = {('Larry', 'Shihtzu') : {'体重(磅)' : 15, '主人' : 'Shawn' '药物(每天)' : 2}, ('雪莉', '黑色实验室') : {'体重(磅)' : 67, '主人' : '马克'}, ('科达', '赫斯基') : {'体重(磅)' : 82, '主人' : '劳拉', '药物(每天)' : 1}}

狗DF

狗名 狗的种类 所有者
拉里 施氏 肖恩
雪 莉 黑色实验室 马克
科达 沙哑 劳 拉

如果词典的格式应该改变,我愿意接受建议。感谢您的帮助!

我已经试过了: dogsDF['所有者'] = dogsDF['狗名'].apply(lambda x : dogOwners.get(x)).fillna('')

python-3.x pandas 数据帧 字典 嵌套

评论


答:

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()

希望对您有所帮助!