20

まず、次の空の DataFrame を事前に割り当てます。

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

df次に、長さ10000のnumpy配列をデータとして行ごとに(効率的に)更新したいと思います。私の問題は次のとおりです。このタスクを達成するためにどの DataFrame の方法を使用すればよいかさえわかりません。

ありがとうございました!

4

2 に答える 2

28

これは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 回だけになります。

于 2013-09-12T19:14:28.937 に答える
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%20effective%20dataframe%20set%20row

于 2013-09-12T19:09:40.760 に答える