将pandas数据帧切成相等长度的34

时间:2015-08-31 18:20:26

标签: python pandas

我有一个如下所示的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

2 个答案:

答案 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]