2016-12-05 16 views
0

私はパンダにはかなり新しいです。Pandas for loop replacement

私は、データフレーム上で行ごとにループを繰り返すためにパンダを使用しようとしています。各行について、その行を別のデータフレームのすべての行(約len 7)と比較したいと考えています。

データフレームは非常に大きいです(インデックスは10月から10月まで10分です)。入れ子になっているforループでは、実行するには年齢がかかります(約20分)。パンダと明らかに

frame['Group1 ON With Exception'] = '' 
    for i in range(len(frame)): 
     for j in range(len(grp1_extpn_tbl)): 
      if ((frame.ix[i,'T01\n(kWh) ':'T22\n(kWh) ']>1) == (grp1_extpn_tbl.loc[j]>0)).all():  
       frame.ix[i,'Group1 ON With Exception'] = '' 
       break 
      else:    
       frame.ix[i,'Group1 ON With Exception'] = 'NOT VALID GROUP1 DATA' 

かなり(3minsのようなもの)物事をスピードアップされ、キーは、ループを回避することですので、私は、ネストされたnp.where年代を使用してが出ています。問題はかなり面倒なコードブロックに見えて、別の選択肢があるのか​​、それとももっと複雑なコードブロックになるのだろうかと疑問に思いましたか? ;

frame['Group1 ON With Exception'] = '' 
    frame['Group1 ON With Exception'] = np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[0] > 0)).all(), axis=1),'', 
             np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[1] > 0)).all(), axis=1),'', 
             np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[2] > 0)).all(), axis=1),'', 
             np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[3] > 0)).all(), axis=1),'', 
             np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[4] > 0)).all(), axis=1),'', 
             np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[5] > 0)).all(), axis=1),'', 
             np.where((frame.loc[:,'T01\n(kWh) ':'T22\n(kWh) ']).apply(lambda x: ((x>1) == (grp1_extpn_tbl.loc[6] > 0)).all(), axis=1),'','NOT VALID GROUP1 DATA'))))))) 

うまくいけば、上記の情報は十分ですが、どんな助けでも大歓迎です。

おかげで、代わりに私を使用しての

+1

[良い再現性のあるパンダの例を作る方法](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)にチェックを入れ、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を参照してください。 – jezrael

答えて

0

は、jは、データフレーム上で実行する代わりにiterrows()を使用します。

for index, row in df1.iterrows(): 
    if row['column'] in df2['column_to_compare_to']: 
     do_something() 
    else: 
     do_something_else() 

また、len 7の小さなデータフレームをループし、大きなデータフレームから選択するのはなぜですか?選択が空になったら、何かを実行し、選択が結果を返す場合は、それを使って何かを行います。希望が助けてくれる!

+0

帰ってくれて本当にありがとう、そのショットを与えて、あなたに知らせる! –