2016-05-30 5 views
1

私のスクリプトの速度を向上させて、次の答えを見ました:Iterrows Performance Issues。ここでは、iterrowsを使用することはめったにないという答えです。iterrowsの代わりにベクトル化

私のコードでは、非常に簡単で直感的ですが非常に遅いので、私はiterrowsを利用しています。だから私はiterrowsを使用するコードの部分をベクトル化したいと思います。ここでは2つの例があります。私は解決策を見つけることができません。両方の例では列の値は、次の形式を持つすべてのdatetime値です:%Y-%m-%d %H:%M:%S

for index, row in df.iterrows(): 
    df.loc[index, 'Time_Between']= row['Time_Begin'] + timedelta(seconds=row['Some_Integer_Seconds_In_A_Column']) 
    df.loc[index, 'Time_Required']= row['Time_End'] - timedelta(seconds=SomeIntegerSecondsAsAVariable) 
    df.loc[index, 'Tota_Time']= ((row['Time_Begin'] - row['Time_First']).total_seconds())/60 


for index, row in df.iterrows(): 
    if row['Time_Required'] > row['Time_Between']: 
     df.loc[index, 'Check']= 0 
    else: 
     df.loc[index, 'Check']= 1 

は、どのように私はこれをベクトル化することができますか?私はマスキングを適用しようとしたが、何も動かない。ほとんどの時間は、私が手:私はiterrowsを取得いけないTypeError: Cannot change data-type for object array.何か...第二セットの場合

答えて

1

:最初のセットについて

for index, row in df.iterrows(): 
    if row['Time_Required'] > row['Time_Between']: 
     df.loc[index, 'Check']= 0 
    else: 
     df.loc[index, 'Check']= 1 

np.where(row['Time_Required'] > row['Time_Between'], df['Check']= 0, df['Check']= 1) 

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'Time_End': {0: pd.Timestamp('2015-11-15 00:00:00'), 1: pd.Timestamp('2015-10-18 00:00:00'), 2: pd.Timestamp('2015-10-17 00:00:00'), 3: pd.Timestamp('2015-10-16 00:00:00')}, 'Int_Sec': {0: 4, 1: 2, 2: 7, 3: 10}, 'Time_First': {0: pd.Timestamp('2015-10-15 00:00:00'), 1: pd.Timestamp('2015-10-15 00:00:00'), 2: pd.Timestamp('2015-12-15 00:00:00'), 3: pd.Timestamp('2015-12-15 00:00:00')}, 'Time_Begin': {0: pd.Timestamp('2015-10-15 10:00:00'), 1: pd.Timestamp('2015-10-15 12:00:00'), 2: pd.Timestamp('2015-12-15 10:00:00'), 3: pd.Timestamp('2015-12-15 10:00:00')}}) 
print (df) 
    Int_Sec   Time_Begin Time_End Time_First 
0  4 2015-10-15 10:00:00 2015-11-15 2015-10-15 
1  2 2015-10-15 12:00:00 2015-10-18 2015-10-15 
2  7 2015-12-15 10:00:00 2015-10-17 2015-12-15 
3  10 2015-12-15 10:00:00 2015-10-16 2015-12-15 

Sec_Var = 20 
df['Time_Between'] = df['Time_Begin'] + pd.to_timedelta(df['Int_Sec'], unit='s') 
df['Time_Required'] = df['Time_End'] - pd.to_timedelta(Sec_Var, unit='s') 
df['Tota_Time'] = ((df['Time_Begin'] - df['Time_First']).dt.total_seconds())/60 

df['Check'] = np.where(df['Time_Required'] > df['Time_Between'], 0, 1) 

print (df) 

    Int_Sec   Time_Begin Time_End Time_First  Time_Between \ 
0  4 2015-10-15 10:00:00 2015-11-15 2015-10-15 2015-10-15 10:00:04 
1  2 2015-10-15 12:00:00 2015-10-18 2015-10-15 2015-10-15 12:00:02 
2  7 2015-12-15 10:00:00 2015-10-17 2015-12-15 2015-12-15 10:00:07 
3  10 2015-12-15 10:00:00 2015-10-16 2015-12-15 2015-12-15 10:00:10 

     Time_Required Tota_Time Check 
0 2015-11-14 23:59:40  600.0  0 
1 2015-10-17 23:59:40  720.0  0 
2 2015-10-16 23:59:40  600.0  1 
3 2015-10-15 23:59:40  600.0  1 
+0

多くの感謝!私はあなたがこの方法でnp.whereとpd.timedeltaを使用できるかどうかはわかりませんでした。これは私に10分の実行時間をもう一度節約する:) – Uis234

0

:私はあなたが使用することができると思う

df['Time_Between'] = row['Time_Begin'] + timedelta(seconds=row['Some_Integer_Seconds_In_A_Column']) 
df['Time_Required'] = row['Time_End'] - timedelta(seconds=SomeIntegerSecondsAsAVariable) 
df['Tota_Time']  = ((row['Time_Begin'] - row['Time_First']).total_seconds())/60 
関連する問題