как сгруппировать данные и рассчитать конкретную задачу - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть практическое задание ниже:

Рассчитайте общее число рождений за период выборки, сгруппировав данные по имени и полу.Подгруппа группы в мужского и женского пола.Используя эти подмножества, выберите 3 верхних и нижних мужских и женских имени.Сообщите о них в одной таблице.

Итак, у меня есть файл .csv ( 1 ), содержащий имена, пол, рождение и год.Я не могу понять, как именно выполнить эту задачу.

Предыдущая задача была создать сводную таблицу, которую я сделал:

  pivot = data.pivot_table(['births'], index=['sex','year'])

Вывод: 2

              births
sex year            
F   1990  124.598148
    1991  121.215316
    1992  118.106646
    1993  114.475367
    1994  113.331661
    1995  111.563710
    1996  110.258765
    1997  107.671846
    1998  106.412899
    1999  104.643578
    2000  102.779761
    2001  100.116023
    2002   99.283904
    2003   99.055598
    2004   97.443251
    2005   96.216343
    2006   94.690833
    2007   93.415595
    2008   92.263176
    2009   90.823585
M   1990  216.417422
    1991  209.419977
    1992  203.524373
    1993  192.999015
    1994  188.475200
    1995  184.294158
    1996  179.760661
    1997  174.291755
    1998  169.057720
    1999  165.296596
    2000  162.003634
    2001  157.905281
    2002  155.438592
    2003  154.773933
    2004  150.038389
    2005  149.376874
    2006  146.330312
    2007  144.067535
    2008  139.294722
    2009  136.291111

Если так, то мне можно помочь с этим.

Данные .csv выглядят так ...

             name sex  births  year
0         Jessica   F   46459  1990
1          Ashley   F   45544  1990
2        Brittany   F   36532  1990
3          Amanda   F   34391  1990
4        Samantha   F   25864  1990
5           Sarah   F   25803  1990
6       Stephanie   F   24853  1990
7        Jennifer   F   22218  1990
8       Elizabeth   F   20739  1990
9          Lauren   F   20498  1990
10          Megan   F   20249  1990
11          Emily   F   19349  1990
12         Nicole   F   17948  1990
13          Kayla   F   17534  1990
14          Amber   F   15862  1990
15         Rachel   F   15692  1990
16       Courtney   F   15374  1990
17       Danielle   F   14330  1990
18        Heather   F   14216  1990
19        Melissa   F   13996  1990
20        Rebecca   F   13669  1990
21       Michelle   F   13408  1990
22        Tiffany   F   13160  1990
23        Chelsea   F   12782  1990
24      Christina   F   11924  1990
25      Katherine   F   11613  1990
26         Alyssa   F   11259  1990
27        Jasmine   F   11034  1990
28          Laura   F   10903  1990
29         Hannah   F   10276  1990
          ...  ..     ...   ...
587772  Zecharyah   M       5  2009
587773        Zee   M       5  2009
587774   Zekariah   M       5  2009
587775      Zekhi   M       5  2009
587776       Zell   M       5  2009
587777    Zepplin   M       5  2009
587778     Zequan   M       5  2009
587779     Zereon   M       5  2009
587780     Zevion   M       5  2009
587781       Zhen   M       5  2009
587782     Zhyair   M       5  2009
587783       Zien   M       5  2009
587784       Zier   M       5  2009
587785   Zildjian   M       5  2009
587786        Zim   M       5  2009
587787      Zimir   M       5  2009
587788       Ziya   M       5  2009
587789      Ziyun   M       5  2009
587790     Zlatan   M       5  2009
587791       Zoen   M       5  2009
587792     Zubayr   M       5  2009
587793     Zuhaib   M       5  2009
587794      Zykee   M       5  2009
587795     Zykell   M       5  2009
587796      Zylar   M       5  2009
587797  Zyquarius   M       5  2009
587798      Zyran   M       5  2009
587799    Zyreion   M       5  2009
587800     Zyrian   M       5  2009
587801     Zyvion   M       5  2009

1 Ответ

0 голосов
/ 27 сентября 2019

IIUC, это то, что вам нужно.

g=g=df.groupby(['name','sex'])['births'].sum().reset_index(name='birth_sum').sort_values('birth_sum',ascending=False)
top_names=g.loc[g.sex=='F'].head(3).append(g.loc[g.sex=='M'].head(3))
bottom_names=g.loc[g.sex=='F'].tail(3).append(g.loc[g.sex=='M'].tail(3))

Ввод (я изменил данные, поскольку опубликованные вами данные имеют данные только за один год)

       name     sex births  year
0   Jessica     F   46459   1990
1   Ashley      F   45544   1990
2   Brittany    F   36532   1990
3   Amanda      F   34391   1990
4   Samantha    F   25864   1990
5   Jessica     F   46459   1991
6   Ashley      F   45544   1991
7   Brittany    F   36532   1991
8   Amanda      F   34391   1991
9   Samantha    F   55864   1991
10  Jessica     F   46459   1992
11  Ashley      F   45544   1992
12  Brittany    F   86532   1992
13  Amanda      F   34391   1992
14  Samantha    F   55864   1992
15  James       M   15      1990
16  Rob         M   20      1990
17  Bob         M   25      1990
18  Sam         M   45      1990
19  Richard     M   60      1990
20  James       M   15      1991
21  Rob         M   200     1991
22  Bob         M   300     1991
23  Sam         M   45      1991
24  Richard     M   60      1991
25  James       M   145     1992
26  Rob         M   182     1992
27  Bob         M   400     1992
28  Sam         M   216     1992
29  Richard     M   60      1992

Выход

print(top_names)
      name     sex  birth_sum
3   Brittany    F   159596
5   Jessica     F   139377
9   Samantha    F   137592
2   Bob         M   725
7   Rob         M   402
8   Sam         M   306

print(bottom_names)
       name     sex birth_sum
9   Samantha    F   137592
1   Ashley      F   136632
0   Amanda      F   103173
8   Sam         M   306
6   Richard     M   180
4   James       M   175
...