2016-03-01 4 views
0

Как вы можете манипулировать файлами данных на нескольких уровнях с помощью groupby? Я хочу быть в состоянии сделать что-то вродеИерархическая группировка в pandas

data.groupby ('col1'). GroupBy ([ 'col2', 'col3']). Применить (Foo) .Не (бар)

образец данных:

user_id year day hour events 
0 1928375096 2015 196 0 6 
1 734605009 2016 32 21 1 
2 3333305045 2016 29 5 3 
3 698115442 2016 30 7 11 
4 685465592 2016 26 12 3 
5 485945404 2016 24 10 4 
6 73202588 2016 25 3 1 
7 4380205067 2016 25 8 1 
8 408502597 2016 32 9 1 
9 584885164 2016 32 10 3 

Скажем col1 = user_id, col2 = 'год', cOL3 = 'день', таким образом, мы получаем количество строк для каждого пользователя, на каждый день (до 24). Мы хотим сначала запустить foo на события; например, foo(x) = (x-x.mean())/x.std(), то мы хотим сократить временные ряды каждого пользователя до скаляра с помощью bar. Результирующий кадр данных должен содержать одну строку для каждого пользователя.

+1

Это эквивалентно 'data.groupby (['col1', 'col2', 'col3'])', no? У вас будет больше удачи, если вы опубликуете [MVCE] (http://stackoverflow.com/help/mcve). – TomAugspurger

+0

Как функции 'foo' и' bar' вводят вашу формулировку, @TomAugspurger? – Emre

+0

Что такое 'foo' и' bar'? Вы не определили их или «данные». – TomAugspurger

ответ

0

панды не разрезая его, так что я торговал до Blaze, Postgres, BigQuery (где наступили данные в первую очередь), прежде чем возвращаться полный круг с read_gbq функцией панды-х. Я жалуюсь писать SQL-запросы для подачи BiqQuery через pandas. Я хотел иметь возможность использовать операции в стиле DataFrame, но, по крайней мере, я пропускаю промежуточные CSV.

+0

С тех пор я узнал, что у Google есть собственная платформа для ноутбуков с поддержкой BigQuery и функциями, подобными панде: [DataLab] (https://cloud.google.com/datalab/). [Пример ноутбука] (https://github.com/GoogleCloudPlatform/datalab/blob/master/content/datalab/tutorials/BigQuery/BigQuery%20APIs.ipynb). – Emre

0

Во-первых, подумайте о своей проблеме, чтобы убедиться, что вы на самом деле нужна вложенная группа. Это, по существу, вложенный цикл, поэтому производительность может стать скорее раньше обычного. При том, что на пути ...

In [102]: letters = list(string.ascii_lowercase[:13]) 

In [103]: import string 

In [104]: letters = list(string.ascii_lowercase[:13]) 

In [105]: N = 1000 

In [106]: df = pd.DataFrame({'a': np.random.choice(letters, size=N), 
          'b': np.random.choice(letters, size=N), 
          'c': np.random.choice(letters, N), 
          'd': np.random.randn(N)}) 

«а» столбец наш внешний уровень группировки, «пользователь» в ваш комментарий. Мы заблаговременно группируем его, чтобы прекомпретировать его.

In [106]: means = df.groupby('a').d.mean() 

Затем мы обрабатываем каждую группу, собирая результаты во временном списке.

In [107]: out = [] 

In [108]: gr = df.groupby(['a', 'b', 'c']) 

In [108]: for k, v in gr: 
       demeaned = v.groupby(('b', 'c')).d.transform(lambda x: x.count() * x) - means.loc[k[0]] 
       out.append(demeaned) 


In [109]: df['result'] = pd.concat(out) 

In [110]: df 
Out[110]: 
    a b c   d result 
0 j a a 0.677802 1.107368 
1 d k e -0.538711 0.032052 
2 m m f -0.695904 -0.644055 
3 m i i -0.433602 1.069695 
4 m e a -2.349382 -0.560345 
.. .. .. ..  ...  ... 
995 e e m -0.626897 1.409865 
996 g m m 0.434375 -1.402483 
997 h g j -0.939896 1.440304 
998 j k m -0.473171 -0.572188 
999 d c j 0.894530 0.392441 

[1000 rows x 5 columns]