2017-05-07 171 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