Так что я не уверен, что следующее само по себе намеренно, но похоже, что это изменение в поведении по сравнению с пандами 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')
способом?Спасибо.