альтернативный способ построения сводной таблицы - PullRequest
0 голосов
/ 04 октября 2018
>>> df = pd.DataFrame({'a': [1,1,1,1,2,2,2,2,3,3,3,3], 
           'b': [0,0,1,1,0,0,1,1,0,0,1,1,], 
                   'c': [5,5,5,8,9,9,6,6,7,8,9,9]})

>>> df
    a  b  c
0   1  0  5
1   1  0  5
2   1  1  5
3   1  1  8
4   2  0  9
5   2  0  9
6   2  1  6
7   2  1  6
8   3  0  7
9   3  0  8
10  3  1  9
11  3  1  9

Есть ли альтернативный способ получить этот вывод?

>>> pd.pivot_table(df, index=['a','b'], columns='c', aggfunc=len, fill_value=0).reset_index()
c  a  b  5  6  7  8  9
0  1  0  2  0  0  0  0
1  1  1  1  0  0  1  0
2  2  0  0  0  0  0  2
3  2  1  0  2  0  0  0
4  3  0  0  0  1  1  0
5  3  1  0  0  0  0  2

У меня большой df (> ~ 1 м строк) с len(df.c.unique()), равным 134, поэтому pivot принимаетнавсегда.

Я думал, что, учитывая, что этот результат возвращается в течение секунды в моем фактическом df:

>>> df.groupby(by = ['a', 'b', 'c']).size().reset_index()
   a  b  c  0
0  1  0  5  2
1  1  1  5  1
2  1  1  8  1
3  2  0  9  2
4  2  1  6  2
5  3  0  7  1
6  3  0  8  1
7  3  1  9  2

, могу ли я вручную построить желаемый результат из этого вывода выше

1 Ответ

0 голосов
/ 04 октября 2018

1.Вот один из них:

df.groupby(by = ['a', 'b', 'c']).size().unstack(fill_value=0).reset_index()

Вывод:

c  a  b  5  6  7  8  9
0  1  0  2  0  0  0  0
1  1  1  1  0  0  1  0
2  2  0  0  0  0  0  2
3  2  1  0  2  0  0  0
4  3  0  0  0  1  1  0
5  3  1  0  0  0  0  2

2.Вот еще один способ:

pd.crosstab([df.a,df.b], df.c).reset_index()

Вывод:

c  a  b  5  6  7  8  9
0  1  0  2  0  0  0  0
1  1  1  1  0  0  1  0
2  2  0  0  0  0  0  2
3  2  1  0  2  0  0  0
4  3  0  0  0  1  1  0
5  3  1  0  0  0  0  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...