2017-07-07 7 views
1

は、私は、このデータセットpandasデータフレームのその行のフィールドを使用して特定の行を検索および変更するにはどうすればよいですか?

time_in  time_out  total_mins 
8AM   10AM   120 
6AM   8AM   120 
6AM   8AM   -231 

私は何をしようとしていますが、この場合には、否定的になったものを間違ったtotal_mins値を取得しているに持っています。私は多くの例を見つけることだ

をtimein、タイムアウトの違いを再計算し、既存のtotal_mins値を上書き

    1. に(これでOKイム)負total_minsでレコードを識別したいです条件に基づいて特定のレコードを取得するためにixを使用する方法については、私は確信していないものは、その行からフィールドを使用する方法であり、行の特定のフィールドを変更するために使用します。そう、基本的には、いいえ。 2

      私が今考えることのできるオプションは、レコードをループしてテストと変更を実行することですが、ドキュメントではこれをしないように勧めています。

  • 答えて

    1

    to_datetimeで差が必要だと思ったら、total_secondsを取得し、分単位で60で割ります。

    その後masklocて値を変更します。

    mask = df['total_mins'] < 0 
    
    s = (pd.to_datetime(df.loc[mask, 'time_out'], format='%H%p') - 
        pd.to_datetime(df.loc[mask, 'time_in'], format='%H%p')) 
         .dt.total_seconds() 
         .div(60) 
         .astype(int) 
    
    print (s) 
    2 120 
    dtype: int32 
    
    df.loc[mask, 'total_mins'] = s 
    print (df) 
        time_in time_out total_mins 
    0  8AM  10AM   120 
    1  6AM  8AM   120 
    2  6AM  8AM   120 
    

    代替ソリューションmaskで:

    df['total_mins'] = df['total_mins'].mask(mask, s) 
    print (df) 
        time_in time_out total_mins 
    0  8AM  10AM   120 
    1  6AM  8AM   120 
    2  6AM  8AM   120 
    
    +0

    私は理解してこれを使用します。 –

    0

    計算最初のすべての行の違い:あなただけの場合

    total_mins_computed = (pd.to_datetime(df.time_out, format='%H%p') - pd.to_datetime(df.time_in', format='%H%p')).dt.total_seconds() 
    

    負のエントリを修正するには、u se np.where()

    df['total_mins'] = np.where(df.total_mins > 0, df.total_mins, total_mins_computed) 
    
    関連する問題