У меня есть такой кадр данных.

index          column1
e1             {u'c680': 5, u'c681': 1, u'c682': 2...
e2             {u'c780': 6, u'c781': 2, u'c782': 1...
e3             {u'c880': 2, u'c881': 4, u'c882': 2...
e4             {u'c980': 4, u'c981': 2, u'c982': 3...

Теперь я хочу расширить dict в column1 до отдельных столбцов, как показано ниже.

index   colname           c681
e1        c680              5
e1        c681              1
e1        c682              2
e2        c780              6
e2        c781              2
e2        c782              1

Я прошел через пару похожих ответов, где было предложено использовать:

df.column1.apply(pd.Series)

Но это разнесет столбец по-другому ... есть ли способ добиться того, чтобы столбец показывался лучше?

1
Rocky 24 Апр 2020 в 15:51

2 ответа

Вы могли бы map словари с dict.items, сгладьте получающиеся кортежи с помощью itertools.chain и восстановите фрейм данных:

from itertools import chain

chained = chain.from_iterable(df.column1.map(dict.items))
pd.DataFrame(chained , columns=['colname', 'c681'])

  colname  c681
0    c680     5
1    c681     1
2    c682     2
3    c780     6
4    c781     2
5    c782     1
2
yatu 24 Апр 2020 в 13:07

Вы можете сгладить Series словарей в понимании списка и перейти к конструктору DataFrame, решение работает, если index в не столбце во входных данных:

df1 = pd.DataFrame([(k, ) + y for k, v in df.column1.items() for y in v.items()], 
                    columns=['idx','colname', 'c681'])
print (df1)
   idx colname  c681
0   e1    c680     5
1   e1    c681     1
2   e1    c682     2
3   e2    c780     6
4   e2    c781     2
5   e2    c782     1
6   e3    c880     2
7   e3    c881     4
8   e3    c882     2
9   e4    c980     4
10  e4    c981     2
11  e4    c982     3
0
jezrael 24 Апр 2020 в 13:18