Pandas+团购

2024-05-14 21:52:31 发布

您现在位置:Python中文网/ 问答频道 /正文

数据集包含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

我想要名字和最大号码。你知道吗


Tags: 数据代码namenumberfor数量example孩子
3条回答

根据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

我认为,如果每年只有一个最大值-^{}^{},则需要:

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解决方案。你知道吗

你可以试试这个;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

相关问题 更多 >

    热门问题