DataFrame.reset_index неожиданно возвращает типы данных - PullRequest
0 голосов
/ 30 ноября 2018

У меня проблема с пандами, когда кадры данных, загруженные из 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...