Pandas dataframe из словаря значений списка - PullRequest
0 голосов
/ 08 июня 2018

У меня есть словарь со списками в качестве значений, таких как:

cols = {'animals':['dog','cat','fish'],
        'colors':['red','black','blue','dog']}

Я хочу преобразовать это в фрейм данных, в котором каждый из списков перечисляется в соответствии с их ключом с результатом

key variable
animals dog
animals cat
animal fish
colors red
colors black
colors blue
colors dog

Пока что я сделал это: но это не дает мне желаемого результата.

cols_df = pd.DataFrame.from_dict(cols, orient='index')

Как я могу изменить это, чтобы достичь вышеуказанного?

Ответы [ 5 ]

0 голосов
/ 08 июня 2018

Вы можете использовать stack:

df = pd.DataFrame.from_dict(cols, orient='index')
df = df.stack().to_frame().reset_index().drop('level_1', axis=1)
df.columns = ['key', 'variable']

df

key variable
0   colors  red
1   colors  black
2   colors  blue
3   colors  dog
4   animals dog
5   animals cat
6   animals fish

DEMO:

df = pd.DataFrame.from_dict(cols, orient='index')
df

        0   1      2    3
colors  red black  blue dog
animals dog cat    fish None

df.stack() возвращает серию.Это необходимо преобразовать в фрейм данных, используя to_frame().reset_index() выполняется позже, чтобы получить желаемый кадр.

df.stack().to_frame().reset_index()


 level_0 level_1 0
0   colors  0   red
1   colors  1   black
2   colors  2   blue
3   colors  3   dog
4   animals 0   dog
5   animals 1   cat
6   animals 2   fish

Теперь drop('level_1', axis=1) и установите имена столбцов, чтобы получить ожидаемый кадр.

0 голосов
/ 08 июня 2018

Без импорта, работает на всех входах:

>>> pd.DataFrame([(key, var) for (key, L) in cols.items() for var in L], 
                 columns=['key', 'variable'])

       key variable
0  animals      dog
1  animals      cat
2  animals     fish
3   colors      red
4   colors    black
5   colors     blue
6   colors      dog
0 голосов
/ 08 июня 2018

Возможно, это не самое быстрое решение, и вам нужны дополнительные списки.

d = {'animals': ['dog','cat','fish'],
     'colors': ['red','black','blue','dog']}

keys = [k for k in d.keys() for v in d[k]]
values = [v for k in d.keys() for v in d[k]]
pd.DataFrame.from_dict({'index': keys, 'values': values})
0 голосов
/ 08 июня 2018
pd.DataFrame.from_dict(cols, orient='index').T.unstack().dropna().reset_index(level=1,drop=True)

animals      dog
animals      cat
animals     fish
colors       red
colors     black
colors      blue
colors       dog

, где нам сначала нужно заполнить столбцы одинаковой длины, чтобы предотвратить ошибку from_dict(.. orient='columns').Два способа сделать это:

  1. pd.DataFrame.from_dict(cols, orient='index').T - недокументированный трюк, который я нашел в этом ответе от root ;transpose добавляет ячейки NaN, чтобы сделать результат прямоугольным
  2. Ручная альтернатива - найти, сколько ячеек вам нужно для заполнения каждой строки, например:

    Вычислить количество площадок с помощью df_cols.apply(pd.Series.pad, max(len(c) for c in cols.values())) ... cols['animals'].append(np.NaN)

0 голосов
/ 08 июня 2018

Использование itertools.chain и itertools.repeat:

import pandas as pd
from itertools import chain, repeat

chainer = chain.from_iterable

d = {'animals': ['dog', 'cat', 'fish'],
     'colors': ['red', 'black', 'blue', 'dog']}

df = pd.DataFrame({'key': list(chainer(repeat(k, len(v)) for k, v in d.items())),
                   'variable': list(chainer(d.values()))})

print(df)

       key variable
0  animals      dog
1  animals      cat
2  animals     fish
3   colors      red
4   colors    black
5   colors     blue
6   colors      dog
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...