首先,我预分配了以下空 DataFrame:
df=DataFrame(columns=range(10000),index=range(1000))
然后我想df
用长度为 10000 的 numpy 数组作为数据逐行(有效地)更新。我的问题是:我什至不知道应该使用哪种 DataFrame 方法来完成这项任务。
谢谢!
这里有 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
很明显,建立一个列表,然后一次创建框架比进行任何形式的分配要快几个数量级。作业涉及复制。一次构建所有内容只复制一次。
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