Превращение словаря с одним ключом и несколькими значениями в кадр данных pandas

avatar
msh855
8 августа 2021 в 23:30
488
2
1

Как превратить этот словарь в фрейм данных pandas?

dict = {'key1':['value1','value2'], 'key2':['value1','value2', 'value3'], 'key3':['value1','value2', 'value3', 'value4'] }

Я пробовал оба варианта:

pd.Dataframe(dict) и pd.DataFrame.from_dict(dict)

но я получаю ту же ошибку.

ValueError: All arrays must be of the same length

Похоже, встроенные возможности работают только для balanced словарей.

Есть помощь?

Источник

Ответы (2)

avatar
tdy
8 августа 2021 в 23:48
2

Похоже, встроенные возможности работают только для сбалансированных словарей.

DataFrame.from_dict можно использовать с нечетными словарями, установив orient='index':

pd.DataFrame.from_dict(d, orient='index')

#            0       1       2       3
# key1  value1  value2    None    None
# key2  value1  value2  value3    None
# key3  value1  value2  value3  value4

Чтобы получить транспонированную версию, свяжите .T:

pd.DataFrame.from_dict(d, orient='index').T

#      key1    key2    key3
# 0  value1  value1  value1
# 1  value2  value2  value2
# 2    None  value3  value3
# 3    None    None  value4

To get a long-form version without nulls, melt the transposed version into id and value columns and dropna only on value:

(pd.DataFrame.from_dict(d, orient='index').T
   .melt(var_name='id', value_name='value')
   .dropna(subset=['value']))

#       id   value
# 0   key1  value1
# 1   key1  value2
# 4   key2  value1
# 5   key2  value2
# 6   key2  value3
# 8   key3  value1
# 9   key3  value2
# 10  key3  value3
# 11  key3  value4
msh855
9 августа 2021 в 06:09
1

Спасибо. Есть ли способ превратить это в «несбалансированную» панель (чтобы избавиться от НС)? Например, столбец «ID» должен быть «ключом» и столбцами значений со значениями ключей?

tdy
9 августа 2021 в 06:32
0

пожалуйста. вы можете melt транспонировать версию, чтобы получить полную версию со столбцами ключ/значение (ответ обновлен)

avatar
Andrej Kesely
8 августа 2021 в 23:37
1

Вы можете использовать itertools.zip_longest для создания фрейма данных:

from itertools import zip_longest

dct = {
    "key1": ["value1", "value2"],
    "key2": ["value1", "value2", "value3"],
    "key3": ["value1", "value2", "value3", "value4"],
}


df = pd.DataFrame(zip_longest(*dct.values(), fillvalue=np.nan), columns=dct)
print(df)

Отпечатки:

     key1    key2    key3
0  value1  value1  value1
1  value2  value2  value2
2     NaN  value3  value3
3     NaN     NaN  value4