2014-09-23 113 views
0

我有兩個數據幀。 DF1包含以下內容:熊貓羣組的時間間隔

用戶|時間間隔

User01 | [01/01/2014 08:12:00,01/01/2014 08:13:43]

User02 | [2014年1月3日7點21分44秒,2014年1月4日1點07分01秒]

DF 2包含事件:

用戶|時間|值

User01 | 01/03/2014 04:11:00 | 9

User01 | 01/01/2014 08:10:00 | 12

User02 | 01/03/2014 09:11:00 | 3

User02 | 01/02/2014 011:10:00 | 21

欲3列添加到DF1,含平均值,標準偏差和最大值的時間間隔內的每個用戶,基於在DF2中的事件。

所以最終的結果應該是這樣的:

用戶|時間間隔|意思是|最大| StDev

User01 | [01/01/2014 08:12:00,01/01/2014 08:13:43] | NaN | NaN |南

User02 | [01/03/2014 07:21:44,01/04/2014 01:07:01] | 3 | 3 | 0

如果我的表格很大,這樣做的有效方法是什麼?是否有基於另一個數據幀的時間間隔的某種「groupby」功能?

代碼:

import pandas as pd 

DF1 = pd.DataFrame({'User' : pd.Series(["User01", "User02"], index=['1', '2']), 'Time start' : pd.Series(["01/01/2014 08:12:00", "01/03/2014 07:21:44"], index=['1', '2']),'Time end' : pd.Series(["01/01/2014 08:13:43", "01/04/2014 01:07:01"], index=['1', '2'])}) 

DF2 = pd.DataFrame({'User' : pd.Series(["User01","User01","User02", "User02"], index=['1', '2','3','4']), 'Time' : pd.Series(["01/03/2014 04:11:00", "01/01/2014 08:10:00","01/03/2014 09:11:00","01/02/2014 011:10:00"], index=['1', '2','3', '4']),'Value' : pd.Series([9,12,3,21], index=['1', '2','3','4'])}) 

DF3 = pd.DataFrame({'User' : pd.Series(["User01", "User02"], index=['1', '2']), 'Time start' : pd.Series(["01/01/2014 08:12:00", "01/03/2014 07:21:44"], index=['1', '2']),'Time end' : pd.Series(["01/01/2014 08:13:43", "01/04/2014 01:07:01"], index=['1', '2']),'Mean' : pd.Series(["Nan", 3], index=['1', '2']),'Max' : pd.Series(["Nan", 3], index=['1', '2']),'StDev' : pd.Series(["Nan", 0], index=['1', '2'])}) 
+1

有可複製粘貼的示例很有幫助。同時發佈您的預期解決方案應該與您提供的示例一樣。這應該是可行的,通過將你的'時間間隔'列分成兩個,一個低端和一個高端,然後在第二個數據幀上使用'between_time'之類的東西。 – TomAugspurger 2014-09-23 03:25:40

+0

謝謝。你能通過複製可粘貼的例子來指定你的意思嗎? – 2014-09-23 03:54:03

+2

你說你的數據框是什麼樣的,但你不提供創建它們的代碼。這意味着任何試圖幫助你的人首先必須編寫代碼來創建這些數據框。複製和粘貼代碼以獲得與現在相同的點更容易,而不是浪費時間來重新創建數據結構。試着在你的對象上做df.to_dict(),然後發佈代碼,如'DF1 = pandas.DataFrame({'User':...})等等,而不是僅僅描述你的文字。 – chthonicdaemon 2014-09-23 04:10:11

回答

-1

首先,合併DF1和DF2

df = DF2.merge(DF1,on="User") 

,並創建一個指示器( 「保持」)如果時間下降時間起點和時間之間結束

import numpy as np 
df.loc[:,"keep"] = (np.logical_and(df.loc[:,"Time start"]<=df.loc[:,"Time"],df.loc[:,"Time"]<=df.loc[:,"Time end"]))*1 

輸出:

Time    User Value Time end   Time start  keep 
2014-01-03 04:11:00 User01 9 2014-01-01 08:13:43 2014-01-01 08:12:00 0 
2014-01-01 08:10:00 User01 12 2014-01-01 08:13:43 2014-01-01 08:12:00 0 
2014-01-03 09:11:00 User02 3 2014-01-04 01:07:01 2014-01-03 07:21:44 1 
2014-01-02 11:10:00 User02 21 2014-01-04 01:07:01 2014-01-03 07:21:44 0 

現在只保留其中保持= 1

df = df.loc[df.keep==1,:] 

行現在做aggrgation上DF使用GROUPBY

df4 = df.groupby("User")["Value"].agg(['max','mean','std']).reset_index() 

輸出:

User max mean std 
    User02 3 3 NaN 

合併DF4與DF1

DF1.merge(df4.reset_index(), on="User",how="left") 

輸出:

Time end   Time start   User max mean std 
2014-01-01 08:13:43 2014-01-01 08:12:00 User01 NaN NaN NaN 
2014-01-04 01:07:01 2014-01-03 07:21:44 User02 3.0 3.0 NaN 
+0

降低了我的答案的人請讓我知道爲什麼?以便我可以幫助你。 – 2017-12-23 19:47:10