2015-08-31 86 views
0

我有一個熊貓數據幀看起來像下面相等的長度:切片大熊貓數據幀到第34

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等後綴,這樣我就可以爲頁面的所有特定實例組groupby。我需要這樣,因爲我需要轉發數據。

我試過下面沒有成功:

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

你想的跨頁小時34個組,或者你想爲每個頁面的數據等於34小時大塊? –

+0

@BurhanKhalid對於每一頁,數據拆分爲34小時的塊 – metersk

回答

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

您可以使用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] 
+0

我添加了一個編輯 - 有沒有什麼方法可以將它應用到您的答案中? 「理想情況下,對於有34個多組的頁面,我想添加一個_1,_2,_3等後綴,這樣我就可以對頁面的所有特定實例進行groupby。我需要這樣做,因爲我需要旋轉數據。「 – metersk