Почему pd.concat меняет результирующий тип с int на объект? - PullRequest
0 голосов
/ 24 декабря 2018

Я анализирую несколько CSV-файлов с помощью Pandas и объединяю их в один большой фрейм данных.Затем я хочу groupby и вычислить mean().

Вот примерный кадр данных:

df1.head()

   Time  Node  Packets
0     1     0        0
2     1     1        0
4     1     2        0
6     1     3        0
8     1     4        0

df1.info(verbose=True)

<class 'pandas.core.frame.DataFrame'>
Int64Index: 27972 entries, 0 to 55942
Data columns (total 3 columns):
Time       27972 non-null int64
Node       27972 non-null int64
Packets    27972 non-null int64
dtypes: int64(3)
memory usage: 874.1 KB
None

Затем я объединяю их (для простоты, три кадра данных)

df_total = pd.concat([df1, df2, df3])

df_total.info(verbose=True) приводит к

<class 'pandas.core.frame.DataFrame'>
Int64Index: 83916 entries, 0 to 55942
Data columns (total 3 columns):
Time       83916 non-null object
Node       83916 non-null object
Packets    83916 non-null object
dtypes: object(3)
memory usage: 2.6+ MB
None

Наконец, я пытаюсь:

df_total = df_total.groupby(['Time'])['Packets'].mean()

и вот здесь появляется ошибка pandas.core.base.DataError: No numeric types to aggregate.

Хотя я понимаю из других сообщений, таких как this , что Панды изменяют dtype из-за non-null, Я не смог решить мою проблему с помощью предложенных решений.

Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Я нашел еще одну запись , в которой упоминается, что кадры данных должны быть инициализированы с dtype, в противном случае они имеют тип объекта

Did you initialize an empty DataFrame first and then filled it? If so that's probably
why it changed with the new version as before 0.9 empty DataFrames were initialized 
to float type but now they are of object type. If so you can change the 
initialization to DataFrame(dtype=float).

Поэтому я добавил df_total = pd.DataFrame(columns=['Time', 'Node', 'Packets'], dtype=int) в свой код иэто сработало.

0 голосов
/ 24 декабря 2018
 df_total.info(verbose=True)

Ваше это утверждение дает информацию как объект, поэтому существует проблема в конкатенации, каждое значение не является int, и поэтому среднее значение объекта невозможно.

...