列表字典转换成数据框

52
我有一个字典,每个键都持有一个浮点值列表。这些列表的大小不相同。
我想将此字典转换为pandas数据框,以便可以轻松地对数据执行一些分析函数,例如(最小值、最大值、平均值、标准偏差等)。
我的字典长这样:
{
    'key1': [10, 100.1, 0.98, 1.2],
    'key2': [72.5],
    'key3': [1, 5.2, 71.2, 9, 10.11, 12.21, 65, 7]
}

什么是最好的方法将此内容转换为数据框,以便我可以使用基本函数,例如summeandescribestd

我找到的示例(如上面的链接)都假设列表中每个键具有相同数量的值。


输出应该是什么样子?DataFrame的概念与可变列高度并不真正有意义,因为行没有对齐。几乎肯定有更好的方法来实现你所尝试的功能。例如创建单独的Series。 - Denziloe
简短的回答是:你不能。如果你想要统计函数,你可以使用numpy。 - James
5个回答

69
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

编辑:请注意,来自您基本函数链接的函数也可以处理nan值。然而,它们的估计器可能与numpy的不同。例如,它们计算样本方差的无偏估计量,而numpy版本计算“通常”的样本方差估计量


21
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

这样做有额外的好处,可以使键成为第一列吗?Pycharm调试器显示是这样的。nutrients_totals_df = pd.concat({k:pd.Series(v) for k,v in nutrients_totals_dict.items()}, axis=1) - mLstudent33

5

我建议你创建一个Series字典,因为你的键具有不同数量的值:

{ 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

2

使用

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

或者,由于默认情况下“orient”设置为“columns”,只需使用

df=pd.DataFrame.from_dict(d)


2
你可以:
将索引定义为
idx = counts.keys()

然后将系列连接起来。
df = pd.concat([pd.Series(counts[i]) for i in idx], axis=1).T

最后添加索引。
df.index=idx   

这对我正在做的事情非常有效:一个字典,其值为列表。唯一可以添加的是重命名列。谢谢。 - user2878805

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接