2017-06-20 73 views
0

以下數據基於麪包車的GPS座標,點火是否開啓以及麪包車在特定時間距目標位置有多遠。我想確定一輛貨車是否位於或靠近某個位置(< 300),是否關閉點火裝置,並且如果兩種情況都是正確的,則停留的持續時間。大熊貓 - groupby如果達到標準

在下面的示例中,我將行1-4視爲「分組在一起」,因爲它們是距離爲< 300的連續行。第5行由於其大於300而自行「分組」,並且行因爲它們是連續的行,其距離爲< 300.

因此,由於在1-4行中關閉了點火裝置,所以我想計算持續時間(由於麪包車「停止」在一定的時間內)。然而,其他兩組(第5行和第6-8行)不應計算持續時間,因爲在這些組中點火從未關閉。

df 
AcctID On_Off Distance Timestamp 
123  On  230  12:00 
123  On  30  12:02 
123  Off  29  12:05 
123  Off  35  12:10 
123  On  3000  12:13 
123  On  100  12:20 
123  On  95  12:22 
123  On  240  12:28 

我能分類的距離是否小於300(Within_Distance),但確定點火裝置是否被關在分組的行中的至少一個有我難住了。以下是最終數據框的外觀:

df['Within_Distance'] = np.where(df['Distance']<300, "Yes", "No") 

df 
AcctID On_Off Distance Timestamp Within_Distance Was_Off Within_Distance_and_Was_Off 
123  On  230  12:20  Yes    Yes  Yes 
123  On  30  12:02  Yes    Yes  Yes 
123  Off  29  12:05  Yes    Yes  Yes 
123  Off  35  12:10  Yes    Yes  Yes 
123  On  3000  12:13  No     No   No 
123  On  100  12:20  Yes    No   No 
123  On  95  12:22  Yes    No   No 
123  On  240  12:28  Yes    No   No 

在此先感謝!

回答

2

讓我們嘗試:

df['Within_Distance'] = np.where(df['Distance']<300, "Yes", "No") 

df['Was_Off'] = df.groupby((df.Distance > 300).diff().fillna(0).cumsum())['On_Off'].transform(lambda x: 'Yes' if (x == 'Off').any() else 'No') 

df['Within_Distinace_and_Was_Off'] = np.where((df['Within_Distance'] == 'Yes') & (df['Was_Off'] == 'Yes'),'Yes','No') 

輸出:

AcctID On_Off Distance Timestamp Within_Distance Was_Off \ 
0  123  On  230  12:00    Yes  Yes 
1  123  On  30  12:02    Yes  Yes 
2  123 Off  29  12:05    Yes  Yes 
3  123 Off  35  12:10    Yes  Yes 
4  123  On  3000  12:13    No  No 
5  123  On  100  12:20    Yes  No 
6  123  On  95  12:22    Yes  No 
7  123  On  240  12:28    Yes  No 

    Within_Distinace_and_Was_Off 
0       Yes 
1       Yes 
2       Yes 
3       Yes 
4       No 
5       No 
6       No 
7       No 
+0

,完美的工作。非常感謝你,斯科特! –

1

首先,建立一個布爾場

df['Off'] = df['On_Off'] == 'Off' 

工作然後構建標識groupby連續的行場,如圖所示here

(df['Within_Distance'] != df['Within_Distance'].shift()).cumsum() 

並使用.any以標識布爾在GROUPBY任何行是正確的:

df['Was_Off'] = df.groupby((df['Within_Distance'] != df['Within_Distance'].shift()).cumsum())['Off'].transform(any) 
Out[31]: 
    AcctID On_Off Distance Timestamp Within_Distance Off Was_Off 
0  123  On  230  12:00    Yes False  True 
1  123  On  30  12:02    Yes False  True 
2  123 Off  29  12:05    Yes True  True 
3  123 Off  35  12:10    Yes True  True 
4  123  On  3000  12:13    No False False 
5  123  On  100  12:20    Yes False False 
6  123  On  95  12:22    Yes False False 
7  123  On  240  12:28    Yes False False 
+0

這幾乎爲我工作。不幸的是,當'Within_Distance ==''No''和'Off =='False''時,'Was_Off'返回True,'Within_Distance =='Yes''和'Off =='時我只想'Was_Off'返回True True''。謝謝你的幫助! –

+0

是否有一行與「Within_Distance =='No''和」Off == True「分組?如果不是,那真的很奇怪。 (如果是這樣,這就是'Within_Distance_and_Was_Off'的意思。)你可以發佈一個示例數據框在哪裏發生,所以我可以更多地困惑它? – EFT

+0

'AcctId ON_OFF距離Within_Distance關Was_Off 123關350號真真 123關420號真真 123 100無僞FALSE' –