Словарь списков в dataframe

У меня есть словарь с каждым ключом, содержащий список значений float. Эти списки не имеют одинакового размера.

Я хотел бы преобразовать этот словарь в фреймворк данных, чтобы я мог легко выполнять некоторые функции анализа данных (мин, макс, среднее, стандартное отклонение, больше).

Мой словарь выглядит так:

{
    'key1': [10, 100.1, 0.98, 1.2],
    'key2', [72.5],
    'key3', [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
}

Каков наилучший способ получить это в dataframe, чтобы я мог использовать базовые функции, такие как sum, mean, describe, std?

Примеры, которые я нахожу (например, ссылка выше), все предполагают, что каждый из ключей имеет одинаковое количество значений в списке.

Ответ 1

d={
    'key1': [10, 100.1, 0.98, 1.2],
    'key2': [72.5],
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
}

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

Тогда df

    key3    key2    key1
0   1.00    72.5    10.00
1   5.20    NaN     100.10
2   71.20   NaN     0.98
3   9.00    NaN     1.20
4   10.11   NaN     NaN

Обратите внимание, что numpy имеет некоторые встроенные функции, которые могут выполнять вычисления, игнорируя значения NaN, которые могут иметь значение здесь. Например, если вы хотите найти среднее значение столбца 'key1', вы можете сделать это следующим образом:

import numpy as np
np.nanmean(df[['key1']])
28.07

Другие полезные функции включают numpy.nanstd, numpy.nanvar, numpy.nanmedian, numpy.nansum.

EDIT: Обратите внимание, что функции из вашей базовой ссылки функций также могут обрабатывать значения nan. Однако их оценки могут отличаться от их значений numpy. Например, они вычисляют несмещенную оценку дисперсии выборки, в то время как версия numpy вычисляет "обычную" оценку выборочной дисперсии.

Ответ 2

Я предлагаю вам просто создать букву серии, поскольку ваши ключи не имеют одинакового числа значений:

{ key: pd.Series(val) for key, val in x.items() }

Затем вы можете выполнять операции Pandas по каждому столбцу отдельно.

Если у вас есть это, если вы действительно хотите DataFrame, вы можете:

pd.DataFrame({ key: pd.Series(val) for key, val in x.items() })

     key1  key2   key3
0   10.00  72.5   1.00
1  100.10   NaN   5.20
2    0.98   NaN  71.20
3    1.20   NaN   9.00
4     NaN   NaN  10.11
5     NaN   NaN  12.21
6     NaN   NaN  65.00
7     NaN   NaN   7.00

Ответ 3

your_dict = {
    'key1': [10, 100.1, 0.98, 1.2],
    'key2': [72.5],
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
}

pd.concat({k: pd.Series(v) for k, v in your_dict.items()})

key1  0     10.00
      1    100.10
      2      0.98
      3      1.20
key2  0     72.50
key3  0      1.00
      1      5.20
      2     71.20
      3      9.00
      4     10.11
      5     12.21
      6     65.00
      7      7.00
dtype: float64

Или с axis=1

your_dict = {
    'key1': [10, 100.1, 0.98, 1.2],
    'key2': [72.5],
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
}

pd.concat({k: pd.Series(v) for k, v in your_dict.items()}, axis=1)

     key1  key2   key3
0   10.00  72.5   1.00
1  100.10   NaN   5.20
2    0.98   NaN  71.20
3    1.20   NaN   9.00
4     NaN   NaN  10.11
5     NaN   NaN  12.21
6     NaN   NaN  65.00
7     NaN   NaN   7.00

Ответ 4

Вы можете:

определить индекс как

idx = counts.keys()

затем объединить серию

df = pd.concat([pd.Series(counts[i]) for i in idx], axis=1).T

наконец добавить индекс

df.index=idx