Почему Pandas Transform терпит неудачу, если у вас есть только одна колонка

Посмотрев на этот вопрос, я немного побеспокоился и нашел это:

import pandas as pd df = pd.DataFrame({'a':[1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4]}) df['num_totals'] = df.groupby('a').transform('count') gives ValueError: ValueError Traceback (most recent call last) <ipython-input-38-157c6339ad93> in <module>() 3 #df = pd.DataFrame({'a':[1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4], 'b':[1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4]}) 4 df = pd.DataFrame({'a':[1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4]}) ----> 5 df['num_totals'] = df.groupby('a').transform('count') 6 7 #df['num_totals']=df.groupby('a')[['a']].transform('count') C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\frame.pyc in __setitem__(self, key, value) 2117 else: 2118 # set column -> 2119 self._set_item(key, value) 2120 2121 def _setitem_slice(self, key, value): C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\frame.pyc in _set_item(self, key, value) 2164 """ 2165 value = self._sanitize_column(key, value) -> 2166 NDFrame._set_item(self, key, value) 2167 2168 def insert(self, loc, column, value, allow_duplicates=False): C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\generic.pyc in _set_item(self, key, value) 677 678 def _set_item(self, key, value): --> 679 self._data.set(key, value) 680 self._clear_item_cache() 681 C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\internals.pyc in set(self, item, value) 1779 except KeyError: 1780 # insert at end -> 1781 self.insert(len(self.items), item, value) 1782 1783 self._known_consolidated = False C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\internals.pyc in insert(self, loc, item, value, allow_duplicates) 1793 1794 # new block -> 1795 self._add_new_block(item, value, loc=loc) 1796 1797 except: C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\internals.pyc in _add_new_block(self, item, value, loc) 1909 loc = self.items.get_loc(item) 1910 new_block = make_block(value, self.items[loc:loc + 1].copy(), -> 1911 self.items, fastpath=True) 1912 self.blocks.append(new_block) 1913 C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\internals.pyc in make_block(values, items, ref_items, klass, fastpath, placement) 964 klass = ObjectBlock 965 --> 966 return klass(values, items, ref_items, ndim=values.ndim, fastpath=fastpath, placement=placement) 967 968 # TODO: flexible with index=None and/or items=None C:\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\internals.pyc in __init__(self, values, items, ref_items, ndim, fastpath, placement) 42 if len(items) != len(values): 43 raise ValueError('Wrong number of items passed %d, indices imply %d' ---> 44 % (len(items), len(values))) 45 46 self.set_ref_locs(placement) ValueError: Wrong number of items passed 1, indices imply 0 

Но если у меня есть 2 столбца, тогда он отлично работает:

 df = pd.DataFrame({'a':1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4],'b':1,1,1,1,2,2,3,3,3,4,4,4,4,4,4,4]}) df['num_totals'] = df.groupby('a').transform('count') df Out[40]: ab num_totals 0 1 1 4 1 1 1 4 2 1 1 4 3 1 1 4 4 2 2 2 5 2 2 2 6 3 3 3 7 3 3 3 8 3 3 3 9 4 4 7 10 4 4 7 11 4 4 7 12 4 4 7 13 4 4 7 14 4 4 7 15 4 4 7 

или если я делаю это, используя один столбец df:

 df['num_totals']=df.groupby('a')[['a']].transform('count') 

Существует аналогичная публикация SO, но мне непонятно, почему серия должна завершиться неудачей, и файловый кадр должен работать в приведенном выше примере, и почему работает 2 или более столбцов.

Я использую Python 2.7 64-bit и Pandas 0.12

  • Слияние Pandon Pandas, вызывающее переполнение памяти
  • Как получить первый столбец pandas DataFrame как серии?
  • Pandas read_csv от url
  • Как вы строите вертикальную линию на графике временного ряда в Пандах?
  • Pandas read_clipboard разбит на панды 0.12?
  • Сюжет Панды не накладывается
  • Предварительный файл данных перед pandas read_csv
  • Добавление столбца фрейма данных с len () значений другого столбца
  • One Solution collect form web for “Почему Pandas Transform терпит неудачу, если у вас есть только одна колонка”

    Одиночная колонка в DF

    Как вы отметили выше, это возвращает серию того же размера, что и оригинал

     In [32]: df.groupby('a')['a'].transform('count') Out[32]: 0 4 1 4 2 4 3 4 4 2 5 2 6 3 7 3 8 3 9 7 10 7 11 7 12 7 13 7 14 7 15 7 Name: a, dtype: int64 

    Тем не менее, это сохранение пустой рамки

     In [33]: df.groupby('a').transform('count') Out[33]: Empty DataFrame Columns: [] Index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 

    вы не можете назначить пустой кадр в качестве столбца для другого фрейма, потому что это по существу двусмысленное задание (вы можете сделать так, что он должен «работать»)

    Два столбца в начале DF

    Два случая столбца возвращают одностолбцовый DataFrame

     In [42]: df2.groupby('a').transform('count') Out[42]: b 0 4 1 4 2 4 3 4 4 2 5 2 6 3 7 3 8 3 9 7 10 7 11 7 12 7 13 7 14 7 15 7 In [43]: type(df2.groupby('a').transform('count')) Out[43]: pandas.core.frame.DataFrame Or a series In [45]: df2.groupby('a')['a'].transform('count') Out[45]: 0 4 1 4 2 4 3 4 4 2 5 2 6 3 7 3 8 3 9 7 10 7 11 7 12 7 13 7 14 7 15 7 Name: a, dtype: int64 In [46]: type(df.groupby('a')['a'].transform('count')) Out[46]: pandas.core.series.Series 

    Это «работает», потому что pandas DOES позволяют назначить единый кадр столбца, так как он будет брать базовую серию.

    Поэтому панды на самом деле пытаются помочь. Тем не менее, я нахожу это нечеткое сообщение об ошибке для попытки присвоить пустой кадр.

    Python - лучший язык программирования в мире.