关于python:使用np.array值创建包含字典列表的DataFrame

Creating DataFrame with list of dictionaries with np.array values

我有一个字典列表,其中的值作为numpy数组返回(通常为空)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data=[{'width': array([])},
      {'width': array([])},
      {'width': array([])},
      {'width': array([])},
      {'width': array([])},
      {'width': array([ 0.64848222])},
      {'width': array([ 0.62241745])},
      {'width': array([ 0.76892571])},
      {'width': array([ 0.69913647])},
      {'width': array([ 0.7506934])},
      {'width': array([ 0.69087949])},
      {'width': array([ 0.65302866])},
      {'width': array([ 0.67267989])},
      {'width': array([ 0.63862089])}]

我想创建一个dataFame,如果值是浮动的,而不是numpy数组的数据类型。另外,我希望将空数组转换为NaN值。

我试过使用df=pd.DataFrame(data, dtype=float),它返回一个datafame,其值为np.array,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
               width
0                 []
1                 []
2                 []
3                 []
4                 []
5   [0.648482224582]
6   [0.622417447245]
7   [0.768925710479]
8   [0.699136467373]
9    [0.75069339816]
10  [0.690879488242]
11  [0.653028655088]
12  [0.672679885077]
13  [0.638620890633]

我还尝试在使用df.values.astype(float)创建df值之后重新生成df值,但得到以下错误:埃多克斯1〔2〕

我试图为datafame获得的最终输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
               width
0                NaN
1                NaN
2                NaN
3                NaN
4                NaN
5     0.648482224582
6     0.622417447245
7     0.768925710479
8     0.699136467373
9      0.75069339816
10    0.690879488242
11    0.653028655088
12    0.672679885077
13    0.638620890633

可以使用列表理解从字典中的数组中提取数据。d['width'][0]将从数组中提取第一个值。如果数组为空,则if d['width'].shape[0]将对False进行计算,在这种情况下,将插入None

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> pd.DataFrame([d['width'][0] if d['width'].shape[0] else None for d in data],
                 columns=['width'])
       width
0        NaN
1        NaN
2        NaN
3        NaN
4        NaN
5   0.648482
6   0.622417
7   0.768926
8   0.699136
9   0.750693
10  0.690879
11  0.653029
12  0.672680
13  0.638621

data构建数据帧之后,您需要做的唯一额外的事情是:

1
df.width = df.width.str[0]

这是因为我们只是使用.str访问器来获取每个列表的第一个元素。空列表没有第一个元素,因此返回这些行的NaN

最后是一列float64值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
       width
0        NaN
1        NaN
2        NaN
3        NaN
4        NaN
5   0.648482
6   0.622417
7   0.768926
8   0.699136
9   0.750693
10  0.690879
11  0.653029
12  0.672680
13  0.638621

注意:如果您想显示更多的小数位,您需要使用pd.set_options调整浮点精度。

或者,您可以在构造数据帧之前处理列表:

1
pd.DataFrame([x.get('width') for x in data], columns=['width'])


获取发布的数据帧后,请尝试此操作:

1
2
3
4
5
6
7
def convert(x):
    if len(x) == 0:
            return np.nan
    else:
        return x[0]

 df['width'] = df['width'].apply(lambda x: convert(x))