Распаковка списков диктов по столбцам с уникальными именами в Python / Pandas - PullRequest
1 голос
/ 05 марта 2020

Предположим, у меня есть df ниже:

df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [
    [{'X': 'x1', 'Y': 'y1'}],
    [{'X': 'x2', 'Y': 'y2'}, {'X': 'x3', 'Y': 'y3'}],
    []
]})

df
    A   B
0   a   [{'X': 'x1', 'Y': 'y1'}]
1   b   [{'X': 'x2', 'Y': 'y2'}, {'X': 'x3', 'Y': 'y3'}]
2   c   []

Столбец B включает lists из dicts, который может быть пустым или включать любое число dicts. Каждый дикт будет всегда включать X и Y ключи. Я хочу разделить их на столбцы. Таким образом, первый dict будет производить столбцы X_0 и Y_0 и так далее. В этом примере вывод будет выглядеть так:

df
    A   X_0 Y_0 X_1 Y_1
0   a   x1  y1      
1   b   x2  y2  x3  y3
2   c   

Есть идеи?

1 Ответ

2 голосов
/ 05 марта 2020

Идея заключается в использовании списочного понимания с вложенным словарным пониманием для списка диктовок с новыми ключами, сгенерированными с помощью enumerate, переходом к конструктору Dataframe и DataFrame.join к оригиналу, а также DataFrame.pop используется для столбца извлечения B:

L = [{f'{k}_{i}': v for i, y in enumerate(x) for k, v in y.items()} for x in df.pop('B')]

df = df.join(pd.DataFrame(L, index=df.index))
print (df)
   A  X_0  Y_0  X_1  Y_1
0  a   x1   y1  NaN  NaN
1  b   x2   y2   x3   y3
2  c  NaN  NaN  NaN  NaN

РЕДАКТИРОВАТЬ:

df = pd.DataFrame({'A': ['a', 'b', 'c'], 'B': [
    [{'X': 'x1', 'Y': 'y1'}],
    [{'X': 'x2', 'Y': 'y2'}, {'X': 'x3', 'Y': 'y3'}],
    np.nan
]})


L = [{f'{k}_{i}': v for i, y in enumerate(x) for k, v in y.items()} 
                   if isinstance(x, list)  
                   else {} for x in df.pop('B')]

df = df.join(pd.DataFrame(L, index=df.index))
print (df)
   A  X_0  Y_0  X_1  Y_1
0  a   x1   y1  NaN  NaN
1  b   x2   y2   x3   y3
2  c  NaN  NaN  NaN  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...