pandas高效的数据帧集行

时间:2013-09-12 18:40:03

标签: python pandas dataframe

首先,我预先分配了以下空数据框:

df=DataFrame(columns=range(10000),index=range(1000))

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

谢谢!

2 个答案:

答案 0 :(得分:23)

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

In [5]: row = np.random.randn(100)

行明智分配

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

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

In [9]: def method2():
   ...:     return DataFrame([ row for i in range(1000) ])
   ...: 

逐列分配(两端都有转置)

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

这些都具有相同的输出帧

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

建立一个列表是明确的,然后一次创建帧比任何形式的赋值快几个数量级。作业涉及复制。立即建立所有只复制一次。

答案 1 :(得分:1)

df=DataFrame(columns=range(10),index=range(10))
a = np.array( [9,9,9,9,9,9,9,9,9,9] )

更新行:

df.loc[2] = a

使用杰夫的想法......

df2 = DataFrame(data=np.random.randn(10,10), index=arange(10))
df2.head().T

我写了一个回答这个问题的笔记本: https://www.wakari.io/sharing/bundle/hrojas/pandas%20efficient%20dataframe%20set%20row