#python #pandas #dataframe
#python #панды #фрейм данных
Вопрос:
У меня есть следующий фрейм данных в Pandas, который содержит информацию о моих клиентах и месяце, в котором они что-то купили на моем веб-сайте:
id | Month| Gender
01 | 01 | M
02 | 01 | F
03 | 02 | F
04 | 02 | F
Мне нужно знать, сколько мужчин и женщин покупали что-то каждый месяц. Другими словами, мне нужно превратить мой исходный фрейм данных в это:
Month| Male| Female
01 | 100 |300
02 | 120 |500
03 | 170 |900
04 | 200 |1000
05 | 150 |800
Как я мог это сделать? Я пробовал несколько разных способов, и ни один из них, похоже, не сработал. Спасибо!
Комментарии:
1. откуда берутся 100, 120, 300, 500? Это подсчет строк? когда Gender = M или Gender = F?
2. Извините, я должен был сделать это более понятным. Да, 100, 120, 300 и 500 — это количество строк, где M — мужской, а F — женский. Исходный фрейм данных содержит тысячи строк, а не только 4, как я там указал.
Ответ №1:
pivot_table
должно работать здесь:
df.assign(count=1).pivot_table(index='Month', columns = 'Gender', values='count', aggfunc='sum', fill_value=0)
вывод
Gender F M
Month
1 1 1
2 2 0
Ответ №2:
Другим решением было бы:
cats = ['M','F']
df['Gender'] = pd.Categorical(df['Gender'], categories=cats, ordered=True)
df = df.groupby(['Month', 'Gender']).size().unstack(fill_value=0)
что дает:
Gender M F
Month
1 1 1
2 0 2
Ответ №3:
ВЫБЕРИТЕ месяц, посчитайте ((РЕГИСТР Пол, КОГДА Пол = ‘M’, ЗАТЕМ 1) ) КАК «Мужской», посчитайте ((РЕГИСТР Пол, КОГДА Пол =’, Затем 1)) КАК «Женский» ИЗ таблицы Порядок по месяцам
Комментарии:
1. Извините, приятель, но это вы написали SQL, а не python
Ответ №4:
Было бы лучше, если бы вы включили свой код в свой вопрос, чтобы люди могли вам лучше помочь. Я создал новый фрейм данных, подсчитав строки, которые удовлетворяют как полу, так и месяцу. Вероятно, есть более эффективный метод, но это то, что у меня есть
def count_gender_in_month(month: int, gender: str) -> int:
"""
counts number of rows that have given month and gender
"""
return len(df[(df['month']==month) amp; (df['gender']==gender)])
# originial data
df = pd.DataFrame({'id' : [1,2,3,4],
'month' : [1,1,2,2],
'gender' : ['M', 'F', 'F', 'F']})
months = [1,2,3,4,5,6,7,8,9,10,11,12]
#converted data
ans = pd.DataFrame({'month' : months,
'male' : map(lambda x: count_gender_in_month(x, 'M'), months),
'female' : map(lambda x: count_gender_in_month(x, 'F'), months)})
Комментарии:
1. Эй, чувак, я просто хочу, чтобы ты знал, что твое решение сработало отлично! Это не самый короткий, и именно поэтому я не подписываю его как ответ, но он полностью функционален! Спасибо!
Ответ №5:
import pandas as pd
import numpy as np
df = pd.DataFrame({ 'month' : ['01','01','01','01','02','02','02'],
'gender' : ['M', 'M', 'F', 'M', 'F','F','M']})
и данные выглядят так
month gender
0 01 M
1 01 M
2 01 F
3 01 M
4 02 F
5 02 F
6 02 M
df['male'] = np.where(df['gender']=='M',1,0)
df['female'] = np.where(df['gender']=='F',1,0)
out = df.pivot_table(index=['month'], values=['male','female'],aggfunc=sum,fill_value=0)
даст вам
female male
month
01 1 3
02 2 1