dataframe.groupby изменяет dtypes пустого dataframe - PullRequest
0 голосов
/ 22 мая 2018

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

Допустим, у меня есть какой-то большой массив данных, называемый dfLarge, и я беру из него подмножество df на основенекоторые критерии.(Эта часть проблемы на самом деле не нужна для воспроизведения, но это из моего реального случая использования и того, как я заметил изменение в поведении панд).Но так получилось, что я не смог найти соответствие по критериям, которые искал в dfLarge, и поэтому df пусто.

Что важно, так это то, что df делитсятот же dtypes, что и dfLarge.В общем, это может выглядеть так для некоторых df:

In [187]: df = pd.DataFrame(columns = ['field1','field2','field3','num1','num2'])

In [188]: df['num1'] = df['num1'].astype('float64')  # assume this was inherited from dfLarge

In [189]: df['num2'] = df['num2'].astype('float64')  # assume this was inherited from dfLarge

In [190]: df.dtypes
Out[190]:
field1     object
field2     object
field3     object
num1      float64
num2      float64
dtype: object

Так что теперь у нас есть несколько полей и разных типов данных для пустого фрейма данных df.Когда я агрегирую свои данные, используя df.groupby, сохраняя при этом индекс путем суммирования по field1 и field2, результирующий информационный кадр меняет dtype моих полей.

In [191]: dfGrouped = df.groupby(['field1','field2'])[['num1','num2']].sum().reset_index(level=['field1','field2'])

In [192]: dfGrouped.dtypes
Out[192]:
field1     float64
field2     float64
num1       float64
num2       float64
dtype: object

Насколько я могу видетьиз документации панд, df.groupby не должен этого делать, и я обнаружил изменение только в поведении от панд 0.18.0 (где dtypes не меняется), когда я столкнулся с последующим TypeErrors, когда я тестировал различные fields против некоторых строк.Есть ли способ справиться с этим изящно, в отличие от назначения моего dtypes новому объекту до groupby и повторного применения его df['field'] = df['field'].astype('newtype') способом?Спасибо.

1 Ответ

0 голосов
/ 22 мая 2018

Используйте as_index=False при указании groupby.

Я считаю, что эта ошибка вызвана установкой и сбросом пустого MultiIndex (groupby устанавливает MultiIndex, то вы его сбросили).См. # 19602 в системе отслеживания проблем GitHub.Использование as_index=False предотвращает появление этого шаблона, так как MultiIndex не будет установлен в groupby в первую очередь.

In [2]: pd.__version__
Out[2]: '0.23.0'

In [3]: df = pd.DataFrame(columns=['field1','field2','field3','num1','num2'])
   ...: df = df.astype({'num1': 'float64', 'num2': 'float64'})

In [4]: df.dtypes
Out[4]:
field1     object
field2     object
field3     object
num1      float64
num2      float64
dtype: object

In [5]: dfGrouped = df.groupby(['field1','field2'], as_index=False)[['num1','num2']].sum()

In [6]: dfGrouped.dtypes
Out[6]:
field1     object
field2     object
num1      float64
num2      float64
dtype: object

Обратите внимание, что это должно сохранить поведение для непустых DataFramesтоже:

In [7]: df = pd.DataFrame({'field1': list('aaaa'),
   ...:                    'field2': list('0101'),
   ...:                    'field3': list('wxyz'),
   ...:                    'num1': [0.0, 1.0, 2.0, 3.0],
   ...:                    'num2': [10.0, 11.0, 12.0, 13.0]})

In [8]: df
Out[8]:
  field1 field2 field3  num1  num2
0      a      0      w   0.0  10.0
1      a      1      x   1.0  11.0
2      a      0      y   2.0  12.0
3      a      1      z   3.0  13.0

In [9]: dfGrouped = df.groupby(['field1','field2'], as_index=False)[['num1','num2']].sum()

In [10]: dfGrouped.dtypes
Out[10]:
field1     object
field2     object
num1      float64
num2      float64
dtype: object

In [11]: dfGrouped
Out[11]:
  field1 field2  num1  num2
0      a      0   2.0  22.0
1      a      1   4.0  24.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...