Неожиданная ошибка при попытке объединить кадры данных с категориальными данными

1

У меня есть два dataframes df1 и df2, которые выглядят следующим образом:

#df1
                    counts    freqs
categories                 
automatic           13      0.40625
manual              19      0.59375

#df2

                    counts   freqs
categories                     
Straight Engine      18     0.5625
V engine             14     0.4375

Может ли кто-нибудь объяснить, почему pd.concat([df1, df2], axis = 1) не даст мне этого:

                    counts   freqs
categories                     
automatic               13  0.40625
manual                  19  0.59375 
Straight Engine         18  0.5625
V engine                14  0.4375

Вот что я пробовал:

1 - Использование pd.concat()

Я подозреваю, что способ, которым я создал эти фреймы данных, может быть источником проблемы. И вот как я закончил с этими конкретными кадрами данных:

# imports
import pandas as pd
from pydataset import data # pip install pydataset to get datasets from R

# load data 
df_mtcars = data('mtcars')

# change dummyvariables to more describing variables:
df_mtcars['am'][df_mtcars['am'] == 0] = 'manual'
df_mtcars['am'][df_mtcars['am'] == 1] = 'automatic' 
df_mtcars['vs'][df_mtcars['vs'] == 0] = 'Straight Engine'
df_mtcars['vs'][df_mtcars['vs'] == 1] = 'V engine'

# describe categorical variables
df1 = pd.Categorical(df_mtcars['am']).describe()
df2 = pd.Categorical(df_mtcars['vs']).describe()

Я понимаю, что "категории" - вот что вызывает проблемы здесь, так как df_con = pd.concat([df1, df2], axis = 1) вызывает эту ошибку:

ТипError: категории должны соответствовать существующим категориям при добавлении

Но меня смущает, что все в порядке:

# code
df_con = pd.concat([df1, df2], axis = 1)

# output:
                 counts       freqs  counts   freqs
categories                                      
automatic          13.0     0.40625     NaN     NaN
manual             19.0     0.59375     NaN     NaN
Straight Engine     NaN         NaN    18.0  0.5625
V engine            NaN         NaN    14.0  0.4375

2 - Использование df.append() вызывает ту же ошибку, что и pd.concat()

3 - Использование pd.merge() рода работ, но я теряю индексы:

# Code
df_merge = pd.merge(df1, df2, how = 'outer')

# Output
   counts    freqs
0      13  0.40625
1      19  0.59375
2      18  0.56250
3      14  0.43750

3 - Использование pd.concat() на транспонированных кадрах данных

Поскольку pd.concat() работал с axis = 0 я думал, что смогу туда добраться с помощью транспонированных фреймов данных.

# df1.T 
categories  automatic    manual
counts       13.00000  19.00000
freqs         0.40625   0.59375

# df2.T
categories  Straight Engine  V engine
counts              18.0000   14.0000
freqs                0.5625    0.4375

Но до сих пор нет успеха:

# code
df_con = pd.concat([df1.T, df2.T], axis = 1)

>>> TypeError: categories must match existing categories when appending

Кстати, на что я надеялся, вот что:

categories  automatic    manual Straight Engine  V engine
counts       13.00000  19.00000         18.0000   14.0000
freqs         0.40625   0.59375          0.5625    0.4375

Тем не менее, работы с axis = 0:

# code  
df_con = pd.concat([df1.T, df2.T], axis = 0)

# Output
categories  automatic    manual  Straight Engine  V engine
counts       13.00000  19.00000              NaN       NaN
freqs         0.40625   0.59375              NaN       NaN
counts            NaN       NaN          18.0000   14.0000
freqs             NaN       NaN           0.5625    0.4375

Но это еще далеко не то, что я пытаюсь выполнить.

Теперь я думаю, что можно было бы удалить информацию о категории из df1 и df2, но я еще не смог узнать, как это сделать.

Спасибо за любые другие предложения!

Теги:
pandas
concatenation
categorical-data

1 ответ

1
Лучший ответ

попробуй это,

pd.concat([df1.reset_index(),df2.reset_index()],ignore_index=True)

Выход:

        categories  counts    freqs
0        automatic      13  0.40625
1           manual      19  0.59375
2  Straight Engine      18  0.56250
3         V engine      14  0.43750

Чтобы получить категорию ниже, следуйте этому примеру,

pd.concat([df1.reset_index(),df2.reset_index()],ignore_index=True).set_index('categories')

Выход:

                 counts    freqs
categories                      
automatic            13  0.40625
manual               19  0.59375
Straight Engine      18  0.56250
V engine             14  0.43750

для получения дополнительной информации следуйте этим документам

Ещё вопросы

Сообщество Overcoder
Наверх
Меню