首页 > 解决方案 > Pandas:从另一列中的字典列表创建新列

问题描述

我在熊猫列的每个单元格中有一个任意数量的字典列表。

 df['Amenities'][0] 

 [{'Description': 'Basketball Court(s)'},
 {'Description': 'Bike Rack / Bike Storage'},
 {'Description': 'Bike Rental'},
 {'Description': 'Business Center'},
 {'Description': 'Clubhouse'},
 {'Description': 'Community Garden'},
 {'Description': 'Complex Wifi '},
 {'Description': 'Courtesy Patrol/Officer'},
 {'Description': 'Dog Park'},
 {'Description': 'Health Club / Fitness Center'},
 {'Description': 'Jacuzzi'},
 {'Description': 'Pet Friendly'},
 {'Description': 'Pet Park / Dog Run'},
 {'Description': 'Pool'}]

我想做以下事情。

1) 遍历 dicts 列表,解压它们并创建值为 1 的列(Amenities 退出)。

2)在后续迭代中,检查列标签是否已存在,然后将 1 作为值添加到单元格,如果不存在则创建一个新列。

3) 用 0 填充剩余的列。

基本上,我正在尝试从字典列表中创建包含值 0 和 1 的功能。

下面的代码基于 dict 值创建新列,但围绕检查列是否存在、如果不存在则创建新列以及分配 1 和 0 的部分需要一些思考。

 for i, row in df.iterrows():

     dict_obj = row['Amenities']

     for key, val in dict_obj.items():

         if val in df.columns:

            df.loc[i, val] = 1

         else

            .......

预期结果是这样的:

在此处输入图像描述

标签: pythonpandasdictionary

解决方案


您的代码是一个很好的开始,而且非常接近!

正如您所说,您需要遍历字典。解决方案是.loc在您的数据框(用于当前正在处理的便利设施)上创建新列(如果它尚不存在)或设置其值(如果存在)。

import pandas as pd

df = pd.DataFrame(
    {
        "Amenities": [
            [
                {"Description": "Basketball Court(s)"},
                {"Description": "Bike Rack / Bike Storage"},
                {"Description": "Bike Rental"},
            ],
            [
                {"Description": "Basketball Court(s)"},
                {"Description": "Courtesy Patrol/Officer"},
                {"Description": "Dog Park"},
            ],
        ]
    }
)

for i, row in df.iterrows():
    amenities_list = row["Amenities"]
    for amenity in amenities_list:
        for k, v in amenity.items():
            df.loc[i, v] = 1

df = df.drop(columns="Amenities")
df = df.fillna(0).astype({i: "int" for i in df.columns})

简短描述: i是行索引,v是设施名称(字符串)。df.loc[]如果列索引不存在,则接受行索引、列索引并创建一个新列。

在 for 循环之后,我们只需删除不再需要的“Amentities”列,将所有 NA 值替换为 0,然后将所有列转换为整数(NA 值仅存在于浮点数,因此默认情况下它们以浮点数开头)。


推荐阅读