Как суммировать клиентов, группировать их по полу, а затем по месяцам?

#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