2017-05-07 210 views
0
data=pd.read_csv(path,sep='\t',names=['logtime','dt','uid']) 
df=DataFrame(data) 
uid=df['uid'] 
dt=sorted(df['dt']) 
df1=pd.Series(uid,name='uid') 
df2=pd.Series(dt,name='dt') 
df=pd.concat([df1,df2],axis=1) 
df= df.groupby('uid',as_index=False).agg(lambda x:x.tolist()) 

的部份現在是我的代碼 這是我的數據框的演示示例之前做一團由ID大熊貓GROUPBY ID和月

id dt   
a 2012-01-01 
a 2012-01-01 
a 2012-01-02 
b 2012-01-01 
b 2012-02-01 
c 2012-02-02 
... 
ds 2013-03-01 
zbd 2013-03-28 

我想按月份和ID一樣做出新山坳時間和計數

dt  id times        count   
2012-01 a 2012-01-01,2012-01-01,2012-01-02 3 
     b 2012-01-01       1 
2012-02 b 2012-02-01       1 
     c 2012-02-02       1 
     ... 
2013-03 ds 2013-03-01       1 
     zbd 2013-03-28      1 
+1

這是非常海峽aightforward,它是一個單線程,唯一的小複雜是字符串 - 將多個'dt'日期字符串附加到一個'times'中。告訴我們你已經嘗試了什麼,或者這可能會因爲缺乏努力而被低估,關閉和刪除。 – smci

+1

這個**應該被拒絕投票,因爲它已經在SO上被無數次回答了。以下是來自熊貓文檔的提示:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html –

+0

此外,發佈一個可重複的例子,這意味着我們可以執行的代碼讓你的數據。 – smci

回答

1
#First group by on month and id, then apply 2 functions to generate concatenated time and count in one go. 

df.groupby(by=[df.dt.str[:7], 'id']).dt.agg({'Time': lambda x: ','.join(x),'Count': 
                lambda y: len(y)}).reset_index() 
Out[766]: 
     dt id Count        Time 
0 2012-01 a  3 2012-01-01,2012-01-01,2012-01-02 
1 2012-01 b  1      2012-01-01 
2 2012-02 b  1      2012-02-01 
3 2012-02 c  1      2012-02-02 
4 2013-03 ds  1      2013-03-01 
5 2013-03 zbd  1      2013-03-28 
1
In [84]: (df.groupby([df['dt'].dt.strftime('%Y-%m'), 'id'])['dt'] 
    ...: .agg([lambda x: ','.join(x.astype(str)), 'size']) 
    ...: .rename(columns={'<lambda>':'times', 'size':'count'}) 
    ...: .reset_index() 
    ...:) 
    ...: 
Out[84]: 
     dt id        times count 
0 2012-01 a 2012-01-01,2012-01-01,2012-01-02  3 
1 2012-01 b      2012-01-01  1 
2 2012-02 b      2012-02-01  1 
3 2012-02 c      2012-02-02  1 
4 2013-03 ds      2013-03-01  1 
5 2013-03 zbd      2013-03-28  1