Как взорвать / пролить вложенный список внутри списка внутри столбца данных pandas и сделать из него отдельные столбцы? - PullRequest
2 голосов
/ 23 марта 2020

У меня есть фрейм данных: я хочу разбить столбец Options на id, AUD, ud.

id col1 col2  Options
1  A    B   [{'id':25,'X': {'AUD': None, 'ud':0}}] 
2  C    D   [{'id':27,'X': {'AUD': None, 'ud':0}}] 
3  E    F   [{'id':28,'X': {'AUD': None, 'ud':0}}] 
4  G    H   [{'id':29,'X': {'AUD': None, 'ud':0}}] 

Ожидаемый выходной фрейм данных:

id col1 col2 id   Aud   ud
1  A      B   25  None  0
2  C      D   27  None  0
3  E      F   28  None  0
4  G      H   29  None  0

Как вы go об этом, используя python3 .6 и pandas dataframe?

Ответы [ 2 ]

6 голосов
/ 23 марта 2020

Используйте понимание списка с json_normalize для получения DataFrame s и объедините с помощью concat, также добавлено DataFrame.add_prefix для избежания дублирования имен столбцов:

from pandas.io.json import json_normalize
import ast

L = [json_normalize(x) for x in df.pop('Options')]
#if strings instead dicts
#L = [json_normalize(ast.literal_eval(x)) for x in df.pop('Options')]

df = df.join(pd.concat(L, ignore_index=True, sort=False).add_prefix('opt_'))
print (df)
   id col1 col2  opt_id opt_X.AUD  opt_X.ud
0   1    A    B      25      None         0
1   2    C    D      27      None         0
2   3    E    F      28      None         0
3   4    G    H      29      None         0

Другое решение с извлечением X значений вложенных словарей:

L = [{k: v for y in ast.literal_eval(x) for k, v in {**y.pop('X'), **y}.items()} 
           for x in df.pop('Options')]

df = df.join(pd.DataFrame(L, index=df.index).add_prefix('opt_'))
print (df)
   id col1 col2 opt_AUD  opt_ud  opt_id
0   1    A    B    None       0      25
1   2    C    D    None       0      27
2   3    E    F    None       0      28
3   4    G    H    None       0      29
1 голос
/ 23 марта 2020

Попробуйте это:

for dit in df['Options'].iteritems():
    df.loc[dit[0],'id'] = dit[1][0]['id']
    df.loc[dit[0],'Aud'] = dit[1][0]['X']['AUD']
    df.loc[dit[0],'ud'] = dit[1][0]['X']['ud']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...