2016-08-23 5 views
1

Вот панды Dataframe определяется следующим образом:Как сделать некоторые операции, такие как groupby() и value_counts() в пандах?

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three', 'two'], 
        'C' : [0, 1, 0, 1, 1, 2, 0, 2, 1]}) 
>>> df 
    A  B C 
0 foo one 0 
1 bar one 1 
2 foo two 0 
3 bar three 1 
4 foo two 1 
5 bar two 2 
6 foo one 0 
7 foo three 2 
8 foo two 1 

Я хочу сделать две операции.

Сначала группируйте Dataframe по столбцам A и B. Таким образом, в этом случае получается 6 групп. Эта операция аналогична функции groupby() в пандах.

Затем для каждой группы выполните операцию подсчета для столбца C, поскольку в этом случае это могут быть три разных значения (0, 1 и 2). Эта операция аналогична функции value_counts() в pandas.

Наконец, я хочу новый Dataframe, как это.

 A  B C_value0 C_value1 C_value2 
0 foo one   2   0   0 
1 foo two   1   2   0 
2 foo three   0   0   1 
3 bar one   0   1   0 
4 bar two   0   0   1 
5 bar three   0   1   0 

Может ли кто-нибудь сказать мне, как этого достичь? Благодаря!

ответ

1

Вы можете использовать groupby с агрегирование size, а затем заменить NaN на 0 по fillna, конвертировать в int по astype, add_prefix, reset_index и последний rename_axis (новый в pandas0.18.0):

print (df.groupby(['A','B', 'C'])['C'].size() 
             .unstack() 
             .fillna(0) 
             .astype(int) 
             .add_prefix('C_value') 
             .reset_index() 
             .rename_axis(None, axis=1)) 

    A  B C_value0 C_value1 C_value2 
0 bar one   0   1   0 
1 bar three   0   1   0 
2 bar two   0   0   1 
3 foo one   2   0   0 
4 foo three   0   0   1 
5 foo two   1   2   0 

Другое решение с crosstab :

print (pd.crosstab([df.A, df.B], df.C) 
     .add_prefix('C_value') 
     .reset_index() 
     .rename_axis(None, axis=1)) 

    A  B C_value0 C_value1 C_value2 
0 bar one   0   1   0 
1 bar three   0   1   0 
2 bar two   0   0   1 
3 foo one   2   0   0 
4 foo three   0   0   1 
5 foo two   1   2   0 
+0

Отличное решение! Большое спасибо! – o0Helloworld0o

+0

Рад может вам помочь. Пожалуйста, не забудьте [принять] (http://meta.stackexchange.com/a/5235/295067). Благодарю. – jezrael

+0

Когда я запускаю код, выдается сообщение об ошибке. Ошибка сказала: «TypeError: должен передать индекс для переименования». Затем я удаляю «.rename_axis (None, axis = 1)», и он может успешно работать. – o0Helloworld0o