【问题标题】:Filling empty DataFrame with numpy structured array用 numpy 结构化数组填充空 DataFrame
【发布时间】:2016-12-13 01:34:48
【问题描述】:

我通过执行以下操作创建了一个空的DataFrame

In [581]: df=pd.DataFrame(np.empty(8,dtype=([('f0', '<i8'), ('f1', '<f8'),('f2', '<i8'), ('f3', '<f8'),('f4', '<f8'),('f5', '<f8'), ('f6', '<f8'),('f7', '<f8')])))

In [582]: df
Out[582]: 
           f0             f1          f2             f3             f4  \
0  3714580581  2.448187e-316  3928263553  2.447690e-316   0.000000e+00   
1           0   0.000000e+00           0   0.000000e+00   0.000000e+00   
2           0   0.000000e+00           0   0.000000e+00  3.284339e-315   
3           0   0.000000e+00           0   0.000000e+00   0.000000e+00   
4           0   0.000000e+00   298532785  4.341609e-315   0.000000e+00   
5           0   0.000000e+00  1178683509  2.448189e-316   0.000000e+00   
6           0   0.000000e+00           0   0.000000e+00  7.659812e-315   
7           0   0.000000e+00  4211786525  2.448192e-316   0.000000e+00   

              f5             f6             f7  
0   0.000000e+00   0.000000e+00   0.000000e+00  
1   0.000000e+00   0.000000e+00   0.000000e+00  
2  2.447692e-316  9.702437e-315  2.448246e-316  
3   0.000000e+00   0.000000e+00   0.000000e+00  
4   0.000000e+00   0.000000e+00   0.000000e+00  
5   0.000000e+00   0.000000e+00   0.000000e+00  
6  4.341599e-315   0.000000e+00   0.000000e+00  
7   0.000000e+00   0.000000e+00   0.000000e+00

现在我正在尝试使用 numpy structured array 更改前 4 行的数据:

In [583]: x=np.ones(4,dtype=([('f0', '<i8'), ('f1', '<f8'),('f2', '<i8'), ('f3', '<f8'),('f4', '<f8'),('f5', '<f8'), ('f6', '<f8'),('f7', '<f8')]))

In [584]: x
Out[584]: 
array([(1L, 1.0, 1L, 1.0, 1.0, 1.0, 1.0, 1.0),
       (1L, 1.0, 1L, 1.0, 1.0, 1.0, 1.0, 1.0),
       (1L, 1.0, 1L, 1.0, 1.0, 1.0, 1.0, 1.0),
       (1L, 1.0, 1L, 1.0, 1.0, 1.0, 1.0, 1.0)], 
      dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<f8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8')])

In [585]: df[0:4]=x

ValueError: Must have equal len keys and value when setting with an iterable

有没有其他方法可以做到这一点?

如果我用structured array 的视图填充DataFrame,这将部分起作用:

In [587]: df[0:4]=x.view(np.float64).reshape(x.shape + (-1,))

In [588]: df
Out[588]: 
   f0   f1          f2             f3             f4             f5   f6   f7
0   0  1.0           0   1.000000e+00   1.000000e+00   1.000000e+00  1.0  1.0
1   0  1.0           0   1.000000e+00   1.000000e+00   1.000000e+00  1.0  1.0
2   0  1.0           0   1.000000e+00   1.000000e+00   1.000000e+00  1.0  1.0
3   0  1.0           0   1.000000e+00   1.000000e+00   1.000000e+00  1.0  1.0
4   0  0.0   298532785  4.341609e-315   0.000000e+00   0.000000e+00  0.0  0.0
5   0  0.0  1178683509  2.448189e-316   0.000000e+00   0.000000e+00  0.0  0.0
6   0  0.0           0   0.000000e+00  7.659812e-315  4.341599e-315  0.0  0.0
7   0  0.0  4211786525  2.448192e-316   0.000000e+00   0.000000e+00  0.0  0.0

但正如您所见,f0f2 列现在为 0,因为整数 1 被强制转换为浮点数。

【问题讨论】:

  • df[0:4] = pd.DataFrame(x)?
  • 有趣,行得通。
  • 不幸的是,这个解决方案带来了相当大的性能成本。
  • 你为什么使用structured array而不是dataframe? ayhan 的解决方案会起作用,并且可能会降低性能成本。
  • 嗨,我正在使用numpy.fromfile 读取二进制文件,该文件返回结构化数组

标签: python pandas numpy dataframe structured-array


【解决方案1】:

显而易见的解决方案是给 pandas 一个 pandas 数据框:

df[0:4] = pd.DataFrame(x)

这对性能非常重要,但在您的示例中可能并不明显。

我建议你使用.iloc 方法,因为它更明确。

df.iloc[0:4] = pd.DataFrame(x)

当然,性能下降来自于实例化一个新对象,即 pandas DataFrame,因此这具有相同的性能缺陷。

【讨论】:

    猜你喜欢
    • 2018-12-19
    • 2013-01-20
    • 2011-07-29
    • 1970-01-01
    • 2016-10-10
    • 2018-05-07
    • 1970-01-01
    • 2013-12-29
    • 2018-10-29
    相关资源
    最近更新 更多