2015-05-12 6 views
4

Я пытаюсь агрегировать некоторые статистические данные из объекта groupby на кусках данных. Мне нужно записать данные, потому что их много (18 миллионов) строк. Я хочу найти количество строк в каждой группе в каждом фрагменте, а затем суммировать их. Я могу добавить объекты groupby, но когда группа не присутствует в одном члене, результатом является NaN. Смотрите этот случай:Агрегация объектов pandas groupby

>>> df = pd.DataFrame({'X': ['A','B','C','A','B','C','B','C','D','B','C','D'], 
         'Y': range(12)}) 
>>> df 
    X Y 
0 A 0 
1 B 1 
2 C 2 
3 A 3 
4 B 4 
5 C 5 
6 B 6 
7 C 7 
8 D 8 
9 B 9 
10 C 10 
11 D 11 
>>> df[0:6].groupby(['X']).count() + df[6:].groupby(['X']).count() 
    Y 
X  
A NaN 
B 4 
C 4 
D NaN 

Но я хочу видеть:

>>> df[0:6].groupby(['X']).count() + df[6:].groupby(['X']).count() 
    Y 
X  
A 2 
B 4 
C 4 
D 2 

Есть хороший способ сделать это? Обратите внимание, что в реальном коде я зацикливаюсь через chunked iterator из миллиона строк в группе.

+0

Параметр 'fill_value' хороший вариант, другой вариант заключается в использовании' fillna (0) 'на каждом GroupBy результат, а затем суммируйте их – joris

+0

Возможно, вы захотите изучить Blaze. http://continuum.io/blog/blaze-expressions – Alexander

ответ

2

Вызов add и передать fill_value=0 можно итеративно добавить в то время как комков я предполагаю:

In [98]: 

df = pd.DataFrame({'X': ['A','B','C','A','B','C','B','C','D','B','C','D'], 
         'Y': np.arange(12)}) 
df[0:6].groupby(['X']).count().add(df[6:].groupby(['X']).count(), fill_value=0) 
Out[98]: 
    Y 
X 
A 2 
B 4 
C 4 
D 2 
+0

Спасибо, это работает для меня. Я повторяю каждый патрон, группируя кусок, затем делаю groupedsum.add (newgroupedchunk, fill_value = 0). – Kyle

+0

круто, если мой ответ разрешил ваш вопрос, то, пожалуйста, примите его, чтобы он не остался без ответа, будет пустой галочка в левом верхнем углу моего ответа – EdChum