2014-11-10 2 views
3

Я новичок в панда и у меня есть DataFrame такого рода:Python панда, агрегатные несколько столбцов из одной

name value 
0 alpha a 
1 beta b 
2 gamma c 
3 alpha a 
4 beta b 
5 beta a 
6 gamma a 
7 alpha c 

, который я хотел бы превратиться в один из такого рода:

name a b c 
0 alpha 2 0 1 
1 beta 1 2 0 
2 gamma 1 0 1 

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

ответ

5

Это просто кросс табуляция:

In [78]: 

print pd.crosstab(df.name, df.value) 
value a b c 
name   
alpha 2 0 1 
beta 1 2 0 
gamma 1 0 1 

Если вы используете groupby:

In [90]: 

print df.groupby(['name', 'value']).agg(len).unstack().fillna(0) 
value a b c 
name   
alpha 2 0 1 
beta 1 2 0 
gamma 1 0 1 

Последнее может быть быстрее:

In [92]: 

%timeit df.groupby(['name', 'value']).agg(len).unstack().fillna(0) 
100 loops, best of 3: 3.26 ms per loop 
In [93]: 

%timeit pd.crosstab(df.name, df.value) 
100 loops, best of 3: 7.5 ms per loop 
+0

что делает .agg (LEN) делать ? это как aggfunc? – user308827

+1

yep, '.agg (len)' использует 'len' как' aggfunc' и возвращает длину каждой группы, которая по сути является счетчиком. –

+0

отлично, спасибо много. – user308827

Смежные вопросы