У меня проблема с пандами, когда кадры данных, загруженные из csv, возвращаются к своим исходным dtypes, когда я устанавливаю их индексы после обработки.Посмотрите на это:
#Both these dicts contain columns and column types. They are the same
# except for two records - dtypesA lists columns ('ga:date', 'ga:minute')
# as dtype('O') and dtypesB lists columns ('ga:date', 'ga:minute') as
# dtype('int64')
dtypesA = {'ga:source': dtype('O'), 'ga:deviceCategory': dtype('O'),
'ga:country': dtype('O'), 'ga:metro': dtype('O'), 'ga:date': dtype('O'),
'ga:minute': dtype('O'), 'ga:channelGrouping': dtype('O'), 'ga:sessions':
dtype('int64'), 'ga:transactions': dtype('int64')}
dtypesB = {'ga:source': dtype('O'), 'ga:deviceCategory': dtype('O'),
'ga:country': dtype('O'), 'ga:metro': dtype('O'), 'ga:date': dtype('int64'),
'ga:minute': dtype('int64'), 'ga:channelGrouping': dtype('O'), 'ga:sessions':
dtype('int64'), 'ga:transactions': dtype('int64')}
dfA = pd.read_csv("my.csv", dtype=dtypesA)
dfB = pd.read_csv("my.csv", dtype=dtypesB)
#So the only difference between dfA and dfB now is that
# dfA has columns ('ga:date', 'ga:minute') typed as strings
# and dfB has columns ('ga:date', 'ga:minute') typed as
# ints.
dfB = dfB.astype(dtypesA)
dfB.dtypes
>ga:source object
>ga:deviceCategory object
>ga:country object
>ga:metro object
>ga:date object
>ga:minute object
>ga:channelGrouping object
>ga:sessions int64
>ga:transactions int64
>dtype: object
dfA.dtypes
>ga:source object
>ga:deviceCategory object
>ga:country object
>ga:metro object
>ga:date object
>ga:minute object
>ga:channelGrouping object
>ga:sessions int64
>ga:transactions int64
>dtype: object
#now both df's have the same dtypes.
indexCols = ['ga:source', 'ga:deviceCategory', 'ga:country', 'ga:metro',
'ga:date', 'ga:minute', 'ga:channelGrouping']
dfA.set_index(indexCols, inplace=True)
dfB.set_index(indexCols, inplace=True)
dfA.reset_index().dtypes
>ga:source object
>ga:deviceCategory object
>ga:country object
>ga:metro object
>ga:date object
>ga:minute object
>ga:channelGrouping object
>ga:sessions int64
>ga:transactions int64
>dtype: object
dfB.reset_index().dtypes
>ga:source object
>ga:deviceCategory object
>ga:country object
>ga:metro object
>ga:date int64
>ga:minute int64
>ga:channelGrouping object
>ga:sessions int64
>ga:transactions int64
>dtype: object
Из вышесказанного видно, что после сброса индекса мои столбцы индекса возвращаются к исходному типу данных, а не к типу данных, который я им установил.Это особенно странно, так как DataFrame.astype()
автоматически возвращает новый df, поэтому он не должен помнить старые типы в предыдущем df.
Кто-нибудь знает, как обойти это?
Мне нужнотипы данных в ('ga: date', 'ga: minute') в dfB должны быть строками после сброса индекса (не int).