2016-09-09 12 views
0

私はpython 2.7、pandas(バージョン0.18.1)のデータフレームに取り組んでいます。 同じデータフレーム内の複数の列に基づいてデータフレームの列を変更する必要があります。 以下のサンプル・データがIterrowsの性能

dataを下回るようなものであると私は私のコードを書かれていることについては

私のサンプルデータが

+---+---+----+----+---+---------+---+----+----+---+----------+ 
| a | b | c | d | e | f | g | h | i | j | discount | 
+---+---+----+----+---+---------+---+----+----+---+----------+ 
| 0 | | | | | 65497.6 | | | | |  0 | 
| 0 | | | | | 73882.8 | | | | |  0 | 
| 0 | | | | | 88588 | | 22 | | |  0 | 
| 0 | | | | | 106480 | | 20 | 10 | |  0 | 
| 0 | | | | | 52500 | | | | |  0 | 
| 0 | | 20 | 10 | | 22997.5 | | | | |  0 | 
| | | | | |   | | | | |  0 | 
| 0 | | | 20 | | 0  | | | | |  0 | 
| 0 | | | | | 10520 | | | | |  0 | 
+---+---+----+----+---+---------+---+----+----+---+----------+ 

のようなもので、私のコードは

以下のようなものです

私のデータフレームであります

columns1 = ['a','b','c','d','e'] 
columns2 = ['f','g','h','i','j'] 
data['discount'] = 0 
for i, row in data.iterrows(): 
    a = 0 
    b = 0 
    for col1 in columns1 : 
     value = row[col1] 
     if value > 0: 
     a = value 
     break; 
    for col2 in columns2 : 
     value = row[col2] 
     if value > 0: 
     b = value 
     break; 
    if(a != 0 and b != 0): 
     data.loc[i, 'discount'] = abs(a-b) 

私がやっているようにこの方法では、大量のデータセットに多くの時間とメモリが必要です。私は700メガバイトのデータを持っています。これは処理するのに120GB以上のRAMが必要です。処理が約10時間後に処理されています。Memory Error

このように使用しないでください。どうすればいいですか?私はこのコードをより効率的に書いています。

私はNaN値は、これはあなたのグループのために、各行の最初の非NA値を与え、あなたの空のセルを想定し

+4

は、データのサンプルを提供してください。 – piRSquared

答えて

0

を学ぶことができるように、私は、私の質問を投票ダウンの理由をお聞かせください

res = (df[df>0][columns1].bfill(axis=1).iloc[:,0] 
     -df[df>0][columns2].bfill(axis=1).iloc[:,0]).abs() 
res 

0  NaN 
1  NaN 
2  NaN 
3  NaN 
4  NaN 
5 22977.5 
6  NaN 
7  NaN 
8  NaN 
:このように、これはあなたが探している abs(a-b)を与える

df[df>0][columns1].bfill(axis=1).iloc[:,0] 

0  NaN 
1  NaN 
2  NaN 
3  NaN 
4  NaN 
5 20.0 
6  NaN 
7 20.0 
8  NaN 

:列のに興味があります

あなたが初期化さdiscount列とそれを組み合わせることができ、次のいずれか

res.combine_first(df.discount) 

や空白を埋める:我々は試すことができますので、

res.fillna(0)