Панды + групповой - PullRequest
       9

Панды + групповой

0 голосов
/ 20 сентября 2018

Набор данных содержит 4 столбца, где имя - это имя ребенка, год рождения - год, в котором ребенок родился, число - количество детей, которым было присвоено это имя.

   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 голосов
/ 20 сентября 2018

Вы можете попробовать это;sort и получите last val

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

или вы можете использовать reindex

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

demo:

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
0 голосов
/ 20 сентября 2018

Я считаю нужным, если каждый год имеет только одно максимальное значение - 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 решение.

0 голосов
/ 20 сентября 2018

На основании ответов от на этот вопрос я придумал это решение:

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

print(df)

    name    number  sex yearofbirth
0   Mary    7065    F   1880
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...