Pandas: создавать новые столбцы из списка словарей в другом столбце. - PullRequest
0 голосов
/ 30 мая 2020

У меня есть список произвольного количества словарей в каждой ячейке столбца 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 (выход из «Удобства»).

2) На последующих итерациях проверьте, существует ли уже метка столбца, затем добавьте 1 в качестве значения в ячейку или создайте новый столбец, если он не существует.

3) Заполните оставшиеся столбцы 0.

По сути, я пытаюсь создать функции, которые содержат значения 0 и 1 из списка словарей.

Приведенный ниже код создает новые столбцы на основе значений dict, но часть проверки, существует ли столбец, создания нового, если нет, и присвоения единиц и нулей, требует некоторого размышления.

 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 ]

2 голосов
/ 30 мая 2020

в одну сторону: explode столбец Удобства, затем создать фрейм данных, использовать str.get_dummies в столбце и sum на уровне = 0, например:

#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
2 голосов
/ 30 мая 2020

Ваш код был отличным началом и очень близок!

Как вы сказали, вам нужно перебирать словари. Решение состоит в том, чтобы использовать .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[] принимает индекс строки, индекс столбца и создает новый столбец, если индекс столбца еще не указан.

После l oop мы просто удаляем ненужный столбец «Amentities», замените все значения NA на 0, а затем преобразуйте все столбцы в целые числа (значения NA существуют только для чисел с плавающей запятой, поэтому по умолчанию они изначально являются числами с плавающей запятой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...