数据集包含4列,其中name是孩子的名字,yearofbirth表示孩子的出生年份,number表示以该特定名字命名的婴儿数量。
For example, entry 1 reads, in the year 1880, 7065 girl children were named Mary.
通过大熊猫,我试图每年找出最常用的名字。我的代码
df.groupby(['yearofbirth']).agg({'number':'max'}).reset_index()
上面的代码部分回答了当前的问题。
我想要名字和最大数量。
答案 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_values
和drop_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解决方案。