Получить первое значение из списка словарей в столбце фрейма данных pandas - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть датафрейм для панд:

id       photos
001      [{'medium':'https:blablabla1',
           'xl':'something1',
           's':'anotherthing1'},
         {'medium':'https:blablabla2',
           'xl':'something2',
           's':'anotherthing2'},
         {'medium':'https:blablabla3',
           'xl':'something3',
           's':'anotherthing3'}]
002      [{'medium':'https:blablabla4',
           'xl':'something4',
           's':'anotherthing4'},
         {'medium':'https:blablabla5',
           'xl':'something5',
           's':'anotherthing5'},
         {'medium':'https:blablabla6',
           'xl':'something6',
           's':'anotherthing6'}]
003      [{'medium':'https:blablabla7',
           'xl':'something7',
           's':'anotherthing7'},
         {'medium':'https:blablabla8',
           'xl':'something8',
           's':'anotherthing8'},
         {'medium':'https:blablabla9',
           'xl':'something9',
           's':'anotherthing9'}]

Второй фото столбец содержит список словарей .То, что я хотел бы получить, является значением первой пары ключ: значение в списке.

Желаемый результат должен выглядеть следующим образом:

id       image_url
001      https:blablabla1
002      https:blablabla4
003      https:blablabla7

Я понял, каксделайте это, если это один список диктов.Вот так:

dicts_list = [{'medium':'https:blablabla1',
           'xl':'something1',
           's':'anotherthing1'},
         {'medium':'https:blablabla2',
           'xl':'something2',
           's':'anotherthing2'},
         {'medium':'https:blablabla3',
           'xl':'something3',
           's':'anotherthing3'}]

# Access the first value of the first dict in a list 
list(dicts_list[0].values())[0]

#output
'https:blablabla1'

Я до сих пор достиг этого (что явно неверно):

v = list()
for index, rows in df.iterrows():
    photo = rows['photos']
    v.append(photo[0])

# output
['[', '[']

Идея состоит в том, чтобы поместить первые значения в список, а затем добавить еговернуться к исходному кадру данных.Я не могу понять, как расширить его в фрейм данных панд.

ПРИМЕЧАНИЕ Основываясь на ответе @ daren-thomas, я понял, что словарь, на который я ссылаюсь в моих данных,строковое представление словаря.Чтобы преобразовать этот столбец в словарь, используйте следующий код:

import ast
df.photos = df.photos.apply(lambda x: ast.literal_eval(x))

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать функцию apply в каждой строке следующим образом:

df['image_url'] = df.apply(lambda row: row.photos[0]['medium'], axis=1)

Вывод:

In [23]: df
Out[23]:
   id                                         photos         image_url
0  001  [{u's': u'anotherthing1', u'medium': u'https:b...  https:blablabla1
1  002  [{u's': u'anotherthing4', u'medium': u'https:b...  https:blablabla4
2  003  [{u's': u'anotherthing7', u'medium': u'https:b...  https:blablabla7

Теперь, если вам не нравится столбец photos, вы можете просто бросить его ...

0 голосов
/ 18 сентября 2018

Это один из способов сделать это.Если ваш столбец или Series представляет собой список диктовок, как показано ниже:

>>> import pandas as pd
>>> s = pd.Series([[{'medium':'https:blablabla1',
...   'xl':'something1',
...   's':'anotherthing1'},
... {'medium':'https:blablabla2',
...   'xl':'something2',
...   's':'anotherthing2'},
... {'medium':'https:blablabla3',
...   'xl':'something3',
...   's':'anotherthing3'}],
... [{'medium':'https:blablabla4',
...   'xl':'something4',
...   's':'anotherthing4'},
... {'medium':'https:blablabla5',
...   'xl':'something5',
...   's':'anotherthing5'},
... {'medium':'https:blablabla6',
...   'xl':'something6',
...   's':'anotherthing6'}],
... [{'medium':'https:blablabla7',
...   'xl':'something7',
...   's':'anotherthing7'},
... {'medium':'https:blablabla8',
...   'xl':'something8',
...   's':'anotherthing8'},
... {'medium':'https:blablabla9',
...   'xl':'something9',
...   's':'anotherthing9'}]])
>>> s
0    [{'medium': 'https:blablabla1', 'xl': 'somethi...
1    [{'medium': 'https:blablabla4', 'xl': 'somethi...
2    [{'medium': 'https:blablabla7', 'xl': 'somethi...
dtype: object
>>> s.apply(pd.Series)[0].apply(pd.Series).medium
0    https:blablabla1
1    https:blablabla4
2    https:blablabla7
Name: medium, dtype: object

Не уверен, что есть более элегантное решение.Но надеюсь, что это поможет!

- Правка -

Как примечание, я знаю, что интенсивное использование apply вызывает недовольство в сообществе pandas.Особенно, если у вас очень БОЛЬШИЕ DataFrame с ... вы увидите некоторые проблемы с производительностью.

Я не могу придумать решение vectorized.Но если ваш набор данных не слишком большой, я думаю, что это должно сработать.

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