Табулирование фрейма данных с помощью методов groupby и size

У меня есть фреймворк Pandas out, на который я рассчитываю по столбцам city и raingarden, используя следующую серию:

out.groupby(['city','raingarden']).size() с выходом

city raingarden 55405 True 3 Edina True 7 MInneapolis True 8 Minneapolis False 2482 True 847 Minneapolis False 2 True 1 Minneapolis, True 1 Minneapolis, False 2 Minneapolsi False 5 True 3 Minnepolis False 4 Minnespolis False 4 Minnetonka False 1 True 2 Minnneapolis False 5 Mpla True 3 Mpls False 22 True 20 Mpls. False 8 True 17 NE Mpls True 6 Richfield True 1 SLP True 3 St Louis Park True 2 St. Louis Park False 1 Victoria False 1 Wayzata False 2 True 1 minneapolis False 3 mpls True 2 dtype: int64

Я хочу взять это и вывести в tabulate таблицу.

Для этого я сделал следующее:

headers = ['city','has rain garden', 'n']
print tabulate(out.groupby(['city','raingarden']).size().to_frame(), headers, tablefmt="simple")

Проблема 1. Мне нужно получить имя столбца для счетчиков, но мне не повезло;

Проблема 2 (которая, вероятно, связана с проблемой 1), вывод выглядит следующим образом:

city                          has rain garden
--------------------------  -----------------
(u'55405', True)                            3
(u'Edina', True)                            7
(u'MInneapolis', True)                      8
(u'Minneapolis', False)                  2482
(u'Minneapolis', True)                    847
(u'Minneapolis ', False)                    2
(u'Minneapolis ', True)                     1
(u'Minneapolis,', True)                     1
(u'Minneapolis, ', False)                   2
(u'Minneapolsi', False)                     5
(u'Minneapolsi', True)                      3
(u'Minnepolis', False)                      4
(u'Minnespolis', False)                     4
(u'Minnetonka', False)                      1
(u'Minnetonka', True)                       2
(u'Minnneapolis', False)                    5
(u'Mpla', True)                             3
(u'Mpls', False)                           22
(u'Mpls', True)                            20
(u'Mpls.', False)                           8
(u'Mpls.', True)                           17
(u'NE Mpls', True)                          6
(u'Richfield', True)                        1
(u'SLP', True)                              3
(u'St Louis Park', True)                    2
(u'St. Louis Park', False)                  1
(u'Victoria', False)                        1
(u'Wayzata', False)                         2
(u'Wayzata', True)                          1
(u'minneapolis', False)                     3
(u'mpls', True)                             2

Первые два столбца даны как кортеж? Таким образом, как мне разделить их на отдельные столбцы и как добавить метку для моих счетчиков? Я уверен, что то, чего я пытаюсь достичь, должно быть намного проще, чем я пытался.


person horcle_buzz    schedule 02.03.2016    source источник
comment
Возможно pivot_table это то, что вам нужно. См. stackoverflow.com/questions/34315837/   -  person as133    schedule 02.03.2016
comment
.unstack() результат.   -  person Alexander    schedule 02.03.2016
comment
Можете ли вы добавить out.head() к вопросу, чтобы мы знали, как выглядят ваши исходные данные?   -  person Gustavo Bezerra    schedule 02.03.2016
comment
Развертывание данных - это определенно не то, что мне нужно, но мне это понадобится для другого анализа, который я делаю, поэтому спасибо за ссылку.   -  person horcle_buzz    schedule 02.03.2016


Ответы (1)


Нащупывая два столбца, вы создаете многоуровневый индекс Series, который, как мне кажется, вам не нужен. Я не уверен, как выглядят исходные данные (было бы неплохо указать out.head() в вопросе), но я считаю, что вы ищете:

out.groupby('city').sum()['raingarden']

Вот пример с некоторыми случайно сгенерированными данными:

import random
import string
import pandas as pd
import numpy as np

city = random.sample(string.lowercase*500,100)
raingarden = np.random.randint(0,10,100)

out = pd.DataFrame({'city':city, 'raingarden':raingarden})

Выход:

In [30]: out.groupby('city').sum()['raingarden']
Out[30]:
city
a    17
b     7
c    16
d     8
e    24
f    28
g    16
h    49
i    29
j    24
k     4
l     5
m    17
n    29
p    22
q    14
r    19
s     6
t    21
u     8
v    18
w    25
x    11
y     9
z    40
Name: raingarden, dtype: int64
person Gustavo Bezerra    schedule 02.03.2016
comment
Да, это так ... не знаю, почему я группировался по двум столбцам. - person horcle_buzz; 02.03.2016
comment
Вместо этого мне пришлось использовать метод count (), поскольку raingarden было логическим значением. Но это сработало. - person horcle_buzz; 02.03.2016