2016-05-31 24 views
2

ここに私の質問があります。例として、以下のデータフレームを取る:パンダのマルチループデータ計算を高速化

enter image description here

    df
  • データフレームは、8列があり、それらの各々が有限の値を持っています。
  • 私がやるべきこと:
    • a。 行によってループ
    • bによってループします。各行において、列B1の値、B2B3B4B5は、B6B * X

に変更しますこのようなコード:

for i in range(0,len(df),1): 
    col_B = ["B1","B2","B3","B4","B5","B6",] 
    for j in range(len(col_B)): 
     df.[col_B[j]].iloc[i] = df.[col_B[j]].iloc[i]*df.A.iloc[i] 

224行9列の実データで、これらすべてのセルをループすると、0:01:03というコストがかかります。

パンダのループオーバースピードを上げる方法は?

アドバイスはありがたいです。

答えて

2

することはできまずfilterDataFrameし、複数のmulによって:

print(df.filter(like='B').mul(df.A, axis=0)) 

サンプル:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A':[1,2,3], 
        'B1':[4,5,6], 
        'B2':[7,8,9], 
        'B3':[1,3,5], 
        'B4':[5,3,6], 
        'B5':[7,4,3], 
        'B6':[1,3,7]}) 

print (df) 
    A B1 B2 B3 B4 B5 B6 
0 1 4 7 1 5 7 1 
1 2 5 8 3 3 4 3 
2 3 6 9 5 6 3 7 

print(df.filter(like='B').mul(df.A, axis=0)) 
    B1 B2 B3 B4 B5 B6 
0 4 7 1 5 7 1 
1 10 16 6 6 8 6 
2 18 27 15 18 9 21 

必要欄A場合は、使用しconcat

print (pd.concat([df.A, df.filter(like='B').mul(df.A, axis=0)], axis=1)) 
    A B1 B2 B3 B4 B5 B6 
0 1 4 7 1 5 7 1 
1 2 10 16 6 6 8 6 
2 3 18 27 15 18 9 21 

のタイミング

len(df)=3

In [416]: %timeit (pd.concat([df.A, df.filter(like='B').mul(df.A, axis=0)], axis=1)) 
1000 loops, best of 3: 1.01 ms per loop 

In [417]: %timeit loop(df) 
100 loops, best of 3: 3.28 ms per loop 
len(df)=30k

:タイミングため

In [420]: %timeit (pd.concat([df.A, df.filter(like='B').mul(df.A, axis=0)], axis=1)) 
The slowest run took 4.00 times longer than the fastest. This could mean that an intermediate result is being cached. 
100 loops, best of 3: 3 ms per loop 

In [421]: %timeit loop(df) 
1 loop, best of 3: 35.6 s per loop 

コード:

import pandas as pd 

df = pd.DataFrame({'A':[1,2,3], 
        'B1':[4,5,6], 
        'B2':[7,8,9], 
        'B3':[1,3,5], 
        'B4':[5,3,6], 
        'B5':[7,4,3], 
        'B6':[1,3,7]}) 

print (df) 

df = pd.concat([df]*10000).reset_index(drop=True) 

print (pd.concat([df.A, df.filter(like='B').mul(df.A, axis=0)], axis=1)) 

def loop(df): 
    for i in range(0,len(df),1): 
     col_B = ["B1","B2","B3","B4","B5","B6",] 
     for j in range(len(col_B)): 
      df[col_B[j]].iloc[i] = df[col_B[j]].iloc[i]*df.A.iloc[i] 
    return df 

print (loop(df)) 
関連する問題