Группировка по двум столбцам с ячейками (диапазонами) на одной из них в Pandas Dataframe - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь разделить мои данные в сегменты на основе определенных пользовательских атрибутов, и мне хотелось бы видеть некоторые значения в каждом из сегментов. Для этого я импортировал эти данные в кадр данных Pandas.

У меня есть данные, которые имеют город пользователя, возраст детей и их уникальный идентификатор. Я хотел бы знать количество пользователей, которые проживают в городе А и имеют детей в возрастной группе 0-5 лет.

Пример кадра данных выглядит примерно так:

city  kids_age  user_id
A         10       1  
B          4       2
A          4       3        
C          8       4
A          3       5 

Ожидаемый результат:

city   bin   count
A      0-5      2 
       5-10     1

B      0-5      1
       5-10     0

C      0-5      0
       5-10     1

Я пробовал группировать по двум столбцам city и kids age:

user_details_df_cropped_1.groupby(['city', 'kids_age']).count()

Это дало мне вывод, который выглядит примерно так:

city  kids_age  user_id   count
 A      10       1          1
         4       3          1
         3       5          1
 B       4       2          1 
 C       8       4          1

Я возвращаю пользователей, сгруппированных по городам, но не по возрастным группам (диапазонам) детей. Что мне здесь не хватает? Ценю помощь !!

1 Ответ

1 голос
/ 06 ноября 2019

Используйте cut для биннинга, передайте DataFrame.groupby, добавьте 0 строк с DataFrame.stack DataFrame.unstack последнее преобразование в DataFrame по Series.reset_index:

bins = [0,5,10]
labels = ['{}-{}'.format(i, j) for i, j in zip(bins[:-1], bins[1:])] 
b = pd.cut(df['kids_age'], bins=bins, labels=labels, include_lowest=True)

df = df.groupby(['city', b]).size().unstack(fill_value=0).stack().reset_index(name='count')
print (df)
  city kids_age  count
0    A      0-5      2
1    A     5-10      1
2    B      0-5      1
3    B     5-10      0
4    C      0-5      0
5    C     5-10      1

Другое решение с DataFrame.reindex и MultiIndex.from_product для добавленных рядов затуманивания, заполненных 0:

bins = [0,5,10]
labels = ['{}-{}'.format(i, j) for i, j in zip(bins[:-1], bins[1:])] 
b = pd.cut(df['kids_age'], bins=bins, labels=labels, include_lowest=True)
mux = pd.MultiIndex.from_product([df['city'].unique(), labels], names=['city','kids_age'])

df = (df.groupby(['city', b])
        .size()
        .reindex(mux, fill_value=0)
        .reset_index(name='count'))
print (df)
  city kids_age  count
0    A      0-5      2
1    A     5-10      1
2    B      0-5      1
3    B     5-10      0
4    C      0-5      0
5    C     5-10      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...