2013-07-02 3 views
4

При групповом подсчете нескольких столбцов я получаю сообщение об ошибке. Вот мой dataframe, а также пример, который просто называет отдельные группы «b» и «c».ошибка python pandas при выполнении groupby count

df = pd.DataFrame(np.random.randint(0,2,(4,4)), 
        columns=['a', 'b', 'c', 'd']) 
df['gr'] = df.groupby(['b', 'c']).grouper.group_info[0] 
print df 
    a b c d gr 
0 0 1 0 0 1 
1 1 1 1 0 2 
2 0 0 1 0 0 
3 1 1 1 1 2 

Однако, когда пример немного изменен, чтобы этот счет() вызывается вместо grouper.group_info [0], появится сообщение об ошибке.

df = pd.DataFrame(np.random.randint(0,2,(4,4)), 
        columns=['a', 'b', 'c', 'd']) 
df['gr'] = df.groupby(['b', 'c']).count() 
print df 

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-70-a46f632214e1> in <module>() 
     1 df = pd.DataFrame(np.random.randint(0,2,(4,4)), 
     2     columns=['a', 'b', 'c', 'd']) 
----> 3 df['gr'] = df.groupby(['b', 'c']).count() 
     4 print df 

C:\Python27\lib\site-packages\pandas\core\frame.pyc in __setitem__(self, key, value) 
    2036   else: 
    2037    # set column 
-> 2038    self._set_item(key, value) 
    2039 
    2040  def _setitem_slice(self, key, value): 

C:\Python27\lib\site-packages\pandas\core\frame.pyc in _set_item(self, key, value) 
    2082   ensure homogeneity. 
    2083   """ 
-> 2084   value = self._sanitize_column(key, value) 
    2085   NDFrame._set_item(self, key, value) 
    2086 

C:\Python27\lib\site-packages\pandas\core\frame.pyc in _sanitize_column(self, key, value) 
    2110      value = value.values.copy() 
    2111     else: 
-> 2112      value = value.reindex(self.index).values 
    2113 
    2114     if is_frame: 

C:\Python27\lib\site-packages\pandas\core\frame.pyc in reindex(self, index, columns, method, level, fill_value, limit, copy) 
    2527   if index is not None: 
    2528    frame = frame._reindex_index(index, method, copy, level, 
-> 2529           fill_value, limit) 
    2530 
    2531   return frame 

C:\Python27\lib\site-packages\pandas\core\frame.pyc in _reindex_index(self, new_index, method, copy, level, fill_value, limit) 
    2606      limit=None): 
    2607   new_index, indexer = self.index.reindex(new_index, method, level, 
-> 2608             limit=limit) 
    2609   return self._reindex_with_indexers(new_index, indexer, None, None, 
    2610           copy, fill_value) 

C:\Python27\lib\site-packages\pandas\core\index.pyc in reindex(self, target, method, level, limit) 
    2181    else: 
    2182     # hopefully? 
-> 2183     target = MultiIndex.from_tuples(target) 
    2184 
    2185   return target, indexer 

C:\Python27\lib\site-packages\pandas\core\index.pyc in from_tuples(cls, tuples, sortorder, names) 
    1803     tuples = tuples.values 
    1804 
-> 1805    arrays = list(lib.tuples_to_object_array(tuples).T) 
    1806   elif isinstance(tuples, list): 
    1807    arrays = list(lib.to_object_array_tuples(tuples).T) 

C:\Python27\lib\site-packages\pandas\lib.pyd in pandas.lib.tuples_to_object_array (pandas\lib.c:42342)() 

ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long long' 

ответ

6

Оценка df.groupby(['b', 'c']).count() в интерактивной сессии:

In [150]: df.groupby(['b', 'c']).count() 
Out[150]: 
    a b c d 
b c    
0 0 1 1 1 1 
    1 1 1 1 1 
1 1 2 2 2 2 

Это целая DataFrame. Вероятно, это не то, что вы хотите назначить новому столбцу df (на самом деле вы не можете назначить столбец DataFrame, поэтому возникает критическое исключение.).


Если вы хотите создать новый столбец, который подсчитывает количество строк в каждой группе, вы можете использовать

df['gr'] = df.groupby(['b', 'c'])['a'].transform('count') 

Например,

import pandas as pd 
import numpy as np 
np.random.seed(1) 
df = pd.DataFrame(np.random.randint(0, 2, (4, 4)), 
        columns=['a', 'b', 'c', 'd']) 
print(df) 
# a b c d 
# 0 1 1 0 0 
# 1 1 1 1 1 
# 2 1 0 0 1 
# 3 0 1 1 0 

df['gr'] = df.groupby(['b', 'c'])['a'].transform('count') 

df['comp_ids'] = df.groupby(['b', 'c']).grouper.group_info[0] 
print(df) 

дает

a b c d gr comp_ids 
0 1 1 0 0 1   1 
1 1 1 1 1 2   2 
2 1 0 0 1 1   0 
3 0 1 1 0 2   2 

Обратите внимание, что df.groupby(['b', 'c']).grouper.group_info[0] возвращает что-то отличное от количества строк в каждой группе. Скорее, он возвращает метку для каждой группы.

+0

Если я превращаю его в серию, используя 'df.groupby (['b', 'c']) ['a']. Count()' все равно не работает. Также обратите внимание, что 'df ['gr'] = df ['a'] + df ['b']' работает, поэтому я не понимаю ваших комментариев о невозможности назначить столбцы в dataframe. – user2464433

+0

'df ['a'] + df ['b']' - это серия с одноуровневым индексом, поэтому нет проблем с присвоением ей 'df ['gr']'. 'df.groupby (['b', 'c']) ['a']. count()' является Серией, но имеет мультииндекс, поэтому до сих пор неясно, как это можно присвоить 'df [ 'gr'] ', который имеет одноуровневый индекс. – unutbu

+0

Мне нравится комментарий '# hopefully?' (!) В исключении, вероятно, это бит, который должен быть в try/except, кроме детского сообщения. –

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