【问题标题】:Creating DataFrame with list of dictionaries with np.array values使用具有 np.array 值的字典列表创建 DataFrame
【发布时间】:2015-11-07 00:24:00
【问题描述】:

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

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])}]

如果值是浮点数而不是 numpy 数组 dtype,我想创建一个 DataFame。我也想将空数组转换为 NaN 值。

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

               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 后重铸其值,但出现以下错误: ValueError: setting an array element with a sequence.

我试图为 DataFame 获得的最终输出如下所示:

               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

【问题讨论】:

    标签: python pandas numpy dictionary dataframe


    【解决方案1】:

    data 构建DataFrame 后,您唯一需要做的额外事情是:

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

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

    你最终得到一列 float64 值:

           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 调整浮点精度。

    或者,您可以在构造DataFrame之前处理列表

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

    【讨论】:

    • 我喜欢你使用x.get('width')的替代实现
    • 谢谢!我看到它与您的方法基本相同。我认为可能有一种内置的 Pandas 方法可以做到这一点(例如使用 DataFrame.from_records 或类似方法),但我似乎找不到它......
    【解决方案2】:

    您可以使用列表推导从字典中的数组中提取数据。 d['width'][0] 将从数组中提取第一个值。如果数组为空,if d['width'].shape[0] 将评估为 False,在这种情况下插入 None

    >>> 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
    

    【讨论】:

      【解决方案3】:

      获取您发布的数据框后试试这个:

      def convert(x):
          if len(x) == 0:
                  return np.nan
          else:
              return x[0]
      
       df['width'] = df['width'].apply(lambda x: convert(x))
      

      【讨论】:

        猜你喜欢
        • 2016-02-14
        • 2021-03-17
        • 2018-01-06
        • 2014-06-23
        • 2020-08-31
        • 2017-06-26
        • 2022-01-24
        • 2021-12-06
        • 2020-01-22
        相关资源
        最近更新 更多