Словарь списков в 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