2017-12-28 22 views
0

私はこのようなデータフレームを持っている:書き込み値遅すぎる

df1= 

Customer | Item | Qty 
---------------------- 
001  |A  | 3 
001  |B  | 3  
002  |C  | 4 
002  |D  | 8 
...  |... |... 

私はこのような形式にデータフレームを変換取得したい:私はを通じてこれを行う

df2= 

Customer | A | B | C | D |... 
----------------------------- 
001  | 3 | 3 | 0 | 0 |... 
002  | 0 | 0 | 4 | 8 |... 

customer_list=list(set(df1.Custmer.values)) 
item_list=list(set(df1.Item.values)) 
df2=pd.DataFrame(columns=["Customer"]+item) 
df2["Customer"]=customer_list 
for index in df1.index: 
    df2.loc[df2["Customer"]==df1.loc[index,"Customer"],df1.loc[index,"Item"]]=df1.lic[index,"Qty"] 

しかし、私の元のデータは非常に大きく、df1は1000000+個の行を持ち、プログラムが非常に遅くなります。私は、結果を得るための他の迅速な方法があるかどうかを知りたい。ありがとうございました!

+0

あなたのnumpyの配列データは、パンダのデータフレームに配置される前にnumpyの多次元配列である場合は、行と列を転置する.Tを使用することができます。目的のために、データフレームに配置する前に、選択されたサブアレイを転置することが問題になります。 – mikey

答えて

0

あなたの気持ちは正しいです。一般的に、パンダやnumpyループを使用するときは、通常は劣っています。なぜなら、これらのライブラリを使用することのポイントは、すべての単一行をループするよりも効率的な方法でデータセットを処理するためです。

ここで説明するように、探している方法はピボットです。 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pivot.html

のコードでは、これは次のようになります。

df2 = df1.pivot(index='Customer', columns='Item', values='Qty')

関連する問題