#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. Могу ли я знать, как вы считываете данные?