熊猫+ groupby

时间:2018-09-20 09:47:38

标签: python pandas pandas-groupby data-analysis

数据集包含4列,其中name是孩子的名字,yearofbirth表示孩子的出生年份,number表示以该特定名字命名的婴儿数量。

   For example, entry 1 reads, in the year 1880, 7065 girl children were named Mary.

HEAD of dataset

通过大熊猫,我试图每年找出最常用的名字。我的代码

   df.groupby(['yearofbirth']).agg({'number':'max'}).reset_index()

上面的代码部分回答了当前的问题。

Result of query

我想要名字和最大数量。

3 个答案:

答案 0 :(得分:4)

根据this question的回答,我提出了以下解决方案:

idx = df.groupby(['yearofbirth'])['number'].transform(max) == df['number']
df = df[idx]

print(df)

    name    number  sex yearofbirth
0   Mary    7065    F   1880

答案 1 :(得分:2)

您可以尝试一下; sort并获得last

df.sort_values('number').groupby('yearofbirth').tail(1)

或者您可以使用reindex

df.reindex(df.groupby('yearofbirth').number.idxmax())

演示:

In [1]: df = pd.DataFrame({'name':list('abcaac'),
    ...:                    'yearofbirth':[1800,1800,1801,1801,1802,1802],
    ...:                    'number':[7,8,9,4,2,3],
    ...:                    'sex':['F'] * 6,
    ...: })

In [2]: df.sort_values('number').groupby('yearofbirth').tail(1)
Out[2]:
  name  yearofbirth  number sex
5    c         1802       3   F
1    b         1800       8   F
2    c         1801       9   F


In [3]: df.reindex(df.groupby('yearofbirth').number.idxmax())
Out[3]:
       name  yearofbirth  number sex
number
1         b         1800       8   F
2         c         1801       9   F
5         c         1802       3   F

In [4]: df.loc[df.groupby('yearofbirth').number.idxmax()]
Out[4]:
  name  yearofbirth  number sex
1    b         1800       8   F
2    c         1801       9   F
5    c         1802       3   F

答案 2 :(得分:2)

我认为如果每年只有一个最大值-sort_valuesdrop_duplicates

df = pd.DataFrame({'name':list('abcaac'),
                   'yearofbirth':[1800,1800,1801,1801,1802,1802],
                   'number':[7,8,9,4,2,3],
                   'sex':['F'] * 6,
})

print (df)
  name  yearofbirth  number sex
0    a         1800       7   F
1    b         1800       8   F
2    c         1801       9   F
3    a         1801       4   F
4    a         1802       2   F
5    c         1802       3   F

df1 = (df.sort_values(['yearofbirth', 'number'], ascending=[True, False])
         .drop_duplicates('yearofbirth'))
print (df1)
  name  yearofbirth  number sex
1    b         1800       8   F
2    c         1801       9   F
5    c         1802       3   F

如果每年可能有多个最大值,请使用@Teoretic解决方案。