我的输入是两列数据帧,如下所示:
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' 有没有人对替代方法或我可能出错的地方有任何建议
答案 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
添加unstack
和stack
:
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