Могу ли я включить несколько столбцов данных из excel в боковой индекс в pandas, python

#python #pandas #crosstab

Вопрос:

Мне нужно извлечь данные из вопроса о бренде с несколькими вариантами ответов (данные в Excel в виде отдельных столбцов для каждого варианта) в боковой индекс в таблице перекрестных таблиц. Я пробовал передавать список в аргументе индекса в перекрестной таблице, но это не дает желаемого результата. Также полезно, если бы я мог получить общую колонку вместе с ней.

Ниже приведен образец данных и требуемый формат вывода.

Марка 1 Марка 2 Марка 3 Марка 4 Пол
л.с. Компания Acer Мужской
Лощина Компания Acer MSI Apple Мужской
Apple л.с. Asus Женский
л.с. Apple Мужской

Требуемая производительность:

Бренд Мужской Женский
Компания Acer 2 0
Apple 2 1
Asus 0 1
Лощина 1 0
л.с. 2 1
MSI 1 0

Действительно ценю ваши усилия.

Ответ №1:

Попробуйте перекрестную таблицу после замены пробелов на nan и stack , а затем переименуйте ось, если хотите:

 o = pd.crosstab(df.filter(like="Brand").replace('',np.nan).stack().droplevel(1),
                df['Gender'])
out = o.rename_axis(index='Brand',columns=None).reset_index()
 

 print(out)

   Brand  Female  Male
0   Acer       0     2
1  Apple       1     2
2   Asus       1     0
3   Dell       0     1
4     HP       1     2
5    MSI       0     1
 

Добавление другой альтернативы с помощью value_counts и unstack:

 a = df.filter(like='Brand').replace('',np.nan).stack().to_frame('Brands').droplevel(1)
out = (a.join(df['Gender']).groupby("Brands")['Gender'].value_counts()
        .unstack(fill_value=0))
 

Комментарии:

1. Хмм. Я получаю ошибку ValueError: не удается переиндексироваться с дублирующей оси. Попытка с ignore_index=True этим не сработала.

2. @BenjaminRoy у вас есть дубликаты имен столбцов или дубликаты индексов для начала в вашем фрейме данных? Также не могли бы вы попробовать пример фрейма данных в вопросе. Код отлично работает для меня для примера данных

3.Там нет повторяющихся значений. Также попробовал с приведенным выше примером. Получила ту же ошибку. df=pd.read_excel('consumer.xlsx',sheet_name='test') o = pd.crosstab(df.filter(like="Brand").stack().droplevel(1), df['Gender']) out = o.rename_axis(index='Brand',columns=None).reset_index()

4. @BenjaminRoy Интересно. Какова ваша версия панды ( pd.__version__ ) ? Я провожу тестирование, 1.1.3 и это отлично работает для меня

5. Я использую версию 1.3.2. Могу ли я знать, как вы считываете данные?