pandas高效的数据帧集行

wdg*_*wdg 20 python dataframe pandas

首先,我预先分配了以下空DataFrame:

df=DataFrame(columns=range(10000),index=range(1000))
Run Code Online (Sandbox Code Playgroud)

然后我想df逐行(有效地)使用长度为10000的numpy数组作为数据更新.我的问题是:我甚至不知道我应该使用哪种DataFrame方法来完成此任务.

谢谢!

Jef*_*eff 25

这里有3种方法,只有100列,1000行

In [5]: row = np.random.randn(100)
Run Code Online (Sandbox Code Playgroud)

明智的分配

In [6]: def method1():
   ...:     df = DataFrame(columns=range(100),index=range(1000))
   ...:     for i in xrange(len(df)):
   ...:         df.iloc[i] = row
   ...:     return df
   ...: 
Run Code Online (Sandbox Code Playgroud)

在列表中构建数组,一次创建框架

In [9]: def method2():
   ...:     return DataFrame([ row for i in range(1000) ])
   ...: 
Run Code Online (Sandbox Code Playgroud)

逐列赋值(两端都有转置)

In [13]: def method3():
   ....:     df = DataFrame(columns=range(100),index=range(1000)).T
   ....:     for i in xrange(1000):
   ....:         df[i] = row
   ....:     return df.T
   ....: 
Run Code Online (Sandbox Code Playgroud)

这些都具有相同的输出帧

In [22]: (method2() == method1()).all().all()
Out[22]: True

In [23]: (method2() == method3()).all().all()
Out[23]: True


In [8]: %timeit method1()
1 loops, best of 3: 1.76 s per loop

In [10]: %timeit method2()
1000 loops, best of 3: 7.79 ms per loop

In [14]: %timeit method3()
1 loops, best of 3: 1.33 s per loop
Run Code Online (Sandbox Code Playgroud)

建立一个列表是明确的,然后一次创建框架比执行任何形式的分配快几个数量级.作业涉及复制.立即建立所有只复制一次.

  • 我刚试过`def method4():df = pd.DataFrame(columns = range(100),index = range(1000))for x in xrange(len(df)):df.values [i,:] = row return df`,它比method2()快约40%.我理解.values赋值并不总是类型安全,但如果你知道你的df结构,它应该没问题.是对的吗? (4认同)
  • 或者,替换循环并直接分配,`df.values [:,:] = row`,当分配后按行逐行重复时,可以使速度提高2倍,总体上比`method2( )`。方法2、4和5的每个循环分别获得25.5 ms,15.8 ms和5.83 ms。 (3认同)
  • 对于这个问题并不重要,但我发现df1.equals(df2)比(df1 == df2).all().all()更具可读性,只是为那些不知道equals方法进行比较的人抛出它dataframes (3认同)