2017-07-07 55 views
1

我有這樣的數據集如何使用pandas數據框中該行的字段查找和修改特定行?

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

我所試圖做的就是錯誤的total_mins值,在這種情況下,成爲負的一個。我想

  1. 識別負total_mins記錄(IM確定本)
  2. 重新計算timein和超時差異並覆蓋現有total_mins重視

我發現了很多的例子關於如何使用ix根據條件獲取某些記錄,但我不確定的是如何使用該行中的字段,並使用它們來修改某行中的某個字段。所以基本上沒有。 2

我現在想到的唯一選擇是循環記錄,並執行測試和修改,但文檔建議不要這樣做。

回答

1

我想你需要區別to_datetime,得到total_seconds併除以60幾分鐘。

然後通過locmask更改值:

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

謝謝jezrael,我會理解並使用它。 –

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() 

如果你只是想糾正負面的條目,你se np.where()

df['total_mins'] = np.where(df.total_mins > 0, df.total_mins, total_mins_computed) 
相關問題