2017-01-13 74 views
2

我的输入是一个两列数据帧是这样的:熊猫GROUPBY日期摸出频率

Device, Date 
123414, 2016-11-01 
123456, 2016-10-25 
123414, 2016-10-29 
... 

我想创建是一个有三个列的数据帧,打破多少次,我们就必须每个设备日志每天一次,两次等。作为一个例子,它应该看起来像这样:

Date,  freq, count 
2016-10-01 01 296 
2016-10-01 02 137 
2016-10-01 03 30 
2016-10-02 01 301 
2016-10-02 02 201 
... 

我希望这已经够清楚了。我写的代码是:

df['Freq'] = 1 
groupeddf = df.groupby(['Date','Device']).count() 
finaldf = groupeddf.groupby(['Date','Freq']).count() 

然而,它会弹出KeyError异常:“日期”
没有人有其他方法有什么建议,或者我可能会错误

回答

1

我想你可以通过新的列freq通过size,然后汇总size使用transform

print (df) 
    Device  Date 
0 123414 2016-11-01 
1 123456 2016-11-01 
2 123456 2016-10-25 
3 123414 2016-10-29 
4 123414 2016-10-29 
5 123414 2016-10-29 

df['freq'] = df.groupby(['Device','Date'])['Device'].transform('size') 
print (df) 
    Device  Date freq 
0 123414 2016-11-01  1 
1 123456 2016-11-01  1 
2 123456 2016-10-25  1 
3 123414 2016-10-29  3 
4 123414 2016-10-29  3 
5 123414 2016-10-29  3 

df = df.groupby(['Date','freq']).size().reset_index(name='count') 
print (df) 
     Date freq count 
0 2016-10-25  1  1 
1 2016-10-29  3  3 
2 2016-11-01  1  2 

此外,如果需要的所有组合frequnstackstack

df = df.groupby(['Date','freq']) 
     .size() 
     .unstack(fill_value=0) 
     .stack() 
     .reset_index(name='count') 

print (df) 
     Date freq count 
0 2016-10-25  1  1 
1 2016-10-25  3  0 
2 2016-10-29  1  0 
3 2016-10-29  3  3 
4 2016-11-01  1  2 
5 2016-11-01  3  0 
0

也许有一些误解,但我读你想每天每个设备的频率的频率的问题。这看起来是对@jezrael的一种不同的解释。在这种情况下,你可以调用value_counts两次,得到你想要的

使用比@jezrael你可以做以下

print (df) 
    Device  Date 
0 123414 2016-11-01 
1 123456 2016-11-01 
2 123456 2016-10-25 
3 123414 2016-10-25 
4 123414 2016-10-25 
5 123414 2016-10-29 
6 123414 2016-10-29 
7 123414 2016-10-29 
8 123456 2016-10-29 

df1 = df.groupby('Date')['Device'].apply(lambda x: pd.value_counts(x).value_counts()).reset_index() 
df1.columns = ['Date', 'freq', 'count'] 
df1.sort_values(['Date', 'freq']) 

随着输出略有不同的数据

  Date freq count 
1 2016-10-25  1  1 
0 2016-10-25  2  1 
3 2016-10-29  1  1 
2 2016-10-29  3  1 
4 2016-11-01  1  2