Pandas Groupby日期计算频率

时间:2017-01-13 14:55:18

标签: pandas group-by

我的输入是两列数据帧,如下所示:

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:'Date' 有没有人对替代方法或我可能出错的地方有任何建议

2 个答案:

答案 0 :(得分:1)

我认为您可以transform使用size,然后按新列size汇总freq

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

此外,如果需要所有组合freq添加unstackstack

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

答案 1 :(得分: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