我有一个如下所示的pandas数据框:
page hour count
0 3899549 399593 1530
1 3899549 399594 1610
2 3899549 399595 1592
3 3899549 399596 1220
4 3899549 399597 1729
5 3899549 399598 224
6 3899549 399599 481
完整的数据集可在此处获得: http://www.sharecsv.com/s/b2dbe8e49d6a2481de138f6ca06c679e/test.csv
对于每个页面,有34小时的连续小时数据。在某些情况下,相同的页面在多个不同的时间段内具有34小时的数据。这是有问题的,因为当我创建一个groupby数据帧时,我得到的组是大于34的倍数。理想情况下,我想将这些组中的每个组最多切成34小时。小时数据是连续的,这应该更容易。在链接数据集中,页面0f 3694750
是具有多个34小时周期的页面的示例。
理想情况下,对于具有多个34组的页面,我想添加后缀_1,_2,_3等,以便我可以对页面的所有特定实例进行分组。我需要这样,因为我需要转动数据。
我尝试了以下但没有成功:
for name, group in hourly_groups:
for i, x in enumerate(group):
print x
和
for k, g in df_hourly.groupby(df_hourly['page'] - 34):
print g
答案 0 :(得分:2)
我认为你的描述仍然令人困惑。
要把它做好,这有点棘手
import pandas as pd
cols = ['instance', 'page', 'hour', 'count']
data = [
(0, 3899549, 399593, 1530),
(1, 3899549, 399594, 1610),
(2, 3899549, 399595, 1592),
(3, 3899549, 399596, 1220),
(4, 3899549, 399597, 1729),
(0, 3694750, 395862, 0),
(1, 3694750, 395863, 0),
(2, 3694750, 395864, 0),
(3, 3694750, 395865, 0),
(4, 3694750, 395866, 0),
(0, 3694750, 395862, 1),
(1, 3694750, 395863, 1),
(2, 3694750, 395864, 1),
(3, 3694750, 395865, 1),
(4, 3694750, 395866, 1),
]
df = pd.DataFrame.from_records(data, columns=cols)
grouped = df.groupby(['page', 'instance'])
def g(group):
group.reset_index(drop=True, inplace=True)
group['page'] = group.apply(f, axis=1)
return group
def f(row):
if row.name > 0:
return str(row.page) + '_{0}'.format(int(row.name))
else:
return row.page
res = grouped.apply(g)
res.reset_index(drop=True, inplace=True)
print res.sort('page')
示例输出:
instance page hour count
6 3 3694750 395865 0
0 0 3694750 395862 0
2 1 3694750 395863 0
8 4 3694750 395866 0
4 2 3694750 395864 0
14 4 3899549 399597 1729
10 0 3899549 399593 1530
11 1 3899549 399594 1610
12 2 3899549 399595 1592
13 3 3899549 399596 1220
1 0 3694750_1 395862 1
5 2 3694750_1 395864 1
7 3 3694750_1 395865 1
3 1 3694750_1 395863 1
9 4 3694750_1 395866 1
答案 1 :(得分:1)
您可以使用np.arange(len(df)//34)
来完成这项工作。
df = pd.read_csv('/home/Jian/Downloads/test.csv', index_col=[0])
grouped = df.groupby(np.arange(len(df))//34)
# sample group
grouped.get_group(1)
page hour count
0 3694750 395862 0
1 3694750 395863 0
2 3694750 395864 0
3 3694750 395865 0
4 3694750 395866 0
5 3694750 395867 0
6 3694750 395868 0
7 3694750 395869 0
.. ... ... ...
26 3694750 395888 1215
27 3694750 395889 876
28 3694750 395890 726
29 3694750 395891 496
30 3694750 395892 908
31 3694750 395893 1362
32 3694750 395894 1732
33 3694750 395895 1968
[34 rows x 3 columns]