熊猫:根据另一列中的词典列表创建新列

时间:2020-05-30 13:27:25

标签: python pandas dictionary

我在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)遍历字典列表,解压缩它们并创建值为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

            .......

预期结果如下:

enter image description here

2 个答案:

答案 0 :(得分:2)

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

正如您所说,您需要遍历字典。解决方案是使用<?php require 'function.ipinc.php'; require 'function.ipdec.php'; print("Increment:\n"); for ($i = 0, $ip = "100.0.0.0"; $i <= 16777215; $i++) { print("$ip\n"); $ip = ipinc($ip); } print("----------\n"); print("Decrement:\n"); for ($i = 0, $ip = "100.255.255.255"; $i <= 16777215; $i++) { print("$ip\n"); $ip = ipdec($ip); } print("----------\n"); die("Finished!\n"); ?> 在数据框上创建新列(针对当前正在处理的便利设施)(如果尚不存在),或者使用它设置其值。

.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接受行索引,列索引,如果还没有列索引,则创建一个新列。

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

答案 1 :(得分:2)

一种方法是先explode列“设施”,然后创建一个数据框,在该列上使用str.get_dummies,在level = 0上使用sum,例如:

#data example
df = pd.DataFrame({
    'Amenities': [
        [{'Description': 'Basketball Court(s)'},
         {'Description': 'Bike Rental'}],
        [{'Description': 'Basketball Court(s)'},
         {'Description': 'Clubhouse'},
         {'Description': 'Community Garden'}] 
    ]})

# explode
s = df['Amenities'].explode()
# create dataframe, use get_dummies and sum on the level=0 of index
df_ = pd.DataFrame(s.tolist(), s.index)['Description'].str.get_dummies().sum(level=0)
print (df_)
   Basketball Court(s)  Bike Rental  Clubhouse  Community Garden
0                    1            1          0                 0
1                    1            0          1                 1