[英]Add a row when conditions from multiple columns match in python?
我正在嘗試在數據框中添加一行。 條件是當用戶再次返回(300 秒后)應用程序時,我需要添加一行。 下面是我的代碼。 它工作正常,但需要大量執行時間,因為真實數據幀有 1000 萬行。
for i in range(1,len(df)):
if df['user_id'][i]==df['user_id'][i-1] and (df['start_time'][i]-df['start_time'][i-1]).seconds>300:
df.loc[len(df)]=[df['user_id'][i],df['start_time'][i],'psuedo_App_start_2']
輸入:
user_id start_time event
100 03/04/19 6:11 psuedo_App_start
100 03/04/19 6:11 notification_receive
100 03/04/19 8:56 notification_dismiss
10 03/04/19 22:05 psuedo_App_start
10 03/04/19 22:05 subcategory_click
10 03/04/19 22:06 subcategory_click
輸出應如下所示:
user_id start_time event
100 03/04/19 6:11 psuedo_App_start
100 03/04/19 6:11 notification_receive
100 03/04/19 8:56 psuedo_App_start_2
100 03/04/19 8:56 notification_dismiss
10 03/04/19 22:05 psuedo_App_start
10 03/04/19 22:05 subcategory_click
10 03/04/19 22:06 subcategory_click
如輸出所示,為 user_id = 100 添加了一行,因為他在 8.56 時返回,即 300 秒后。
由2個條件第一過濾器-比較user_id
通過DataFrameGroupBy.shift
由ED 50值每基團,並且還每組差異DataFrameGroupBy.diff
,然后重新分配evet
通過柱DataFrame.assign
,最后concat
在一起並通過排序DataFrame.sort_values
:
#MM/DD/YY HH:MM
#df['start_time'] = pd.to_datetime(df['start_time'])
#DD/MM/YY HH:MM
#df['start_time'] = pd.to_datetime(df['start_time'], dayfirst=True)
m1 = df['user_id'].eq(df.groupby('user_id')['user_id'].shift())
m2 = df.groupby('user_id')['start_time'].diff().dt.total_seconds() > 300
df1 = df[m1 & m2].assign(event='psuedo_App_start_2')
df1 = (pd.concat([df, df1], ignore_index=True)
.sort_values(['user_id','start_time'], ascending=[False, True]))
print (df1)
user_id start_time event
0 100 2019-03-04 06:11:00 psuedo_App_start
1 100 2019-03-04 06:11:00 notification_receive
2 100 2019-03-04 08:56:00 notification_dismiss
6 100 2019-03-04 08:56:00 psuedo_App_start_2
3 10 2019-03-04 22:05:00 psuedo_App_start
4 10 2019-03-04 22:05:00 subcategory_click
5 10 2019-03-04 22:06:00 subcategory_click
通常在這種情況下,您需要將顯式循環轉換為矢量化操作。 嘗試這樣的事情:
i = (df.user_id.values[1:] == df.user_id.values[:-1]) & ((df.start_time.values[1:] - df.start_time.values[:-1])/np.timedelta64(1, 's') > 300)
newRows = tt[np.append(False, i)].copy()
newRows.event = 'psuedo_App_start_2'
df.append(newRows)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.