Python Pandas: получение строк с наибольшим значением - PullRequest
0 голосов
/ 09 октября 2018

Dataframe

Привет!У меня есть датафрейм с годом (1910 ~ 2014), именем, количеством (количество вхождений каждого имени) в качестве столбцов.Я хочу создать новый фрейм данных, в котором будет отображаться имя с наибольшим количеством вхождений в год, и я не совсем уверен, как это сделать.Спасибо!

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Полагаю, groupby & apply - хороший подход:

df = pd.DataFrame({
    'Year': ['1910', '1910', '1911', '1911', '1911', '2014', '2014'], 
    'Name': ['Mary', 'Virginia', 'Elizabeth', 'Mary', 'Ann', 'Virginia', 'Elizabeth'],
    'Count': [848, 270, 254, 360, 451, 81, 380]
})

df
Out:
   Year       Name  Count
0  1910       Mary    848
1  1910   Virginia    270
2  1911  Elizabeth    254
3  1911       Mary    360
4  1911        Ann    451
5  2014   Virginia     81
6  2014  Elizabeth    380

df.groupby(['Year']).apply(lambda x: x.sort_values('Count', ascending=False).head(1))
Out:
        Year       Name  Count
Year                          
1910 0  1910       Mary    848
1911 4  1911        Ann    451
2014 6  2014  Elizabeth    380

Также вы можете изменить head(1) на head(n), чтобы получить n наиболее частых имен в год:

df.groupby(['Year']).apply(lambda x: x.sort_values('Count', ascending=False).head(2))
Out: 
        Year       Name  Count
Year                          
1910 0  1910       Mary    848
     1  1910   Virginia    270
1911 4  1911        Ann    451
     3  1911       Mary    360
2014 6  2014  Elizabeth    380
     5  2014   Virginia     81

Если вам не нравится новый дополнительный индекс, добавьте его через .reset_index(level=0, drop=True):

top_names = df.groupby(['Year']).apply(lambda x: x.sort_values('Count', ascending=False).head(1))
top_names.reset_index(level=0, drop=True)

Out: 
   Year       Name  Count
0  1910       Mary    848
4  1911        Ann    451
6  2014  Elizabeth    380
0 голосов
/ 09 октября 2018

Векторизация

group = df.groupby('year')
df.loc[group['count'].agg('idxmax')]
0 голосов
/ 09 октября 2018

другой способ сделать это - отсортировать значения count и дедуплицировать столбец Year (тоже быстрее):

df.sort_values('Count', ascending=False).drop_duplicates(['Year'])

результаты приведены ниже, вы можете попробовать применить любой методи посмотрите, сколько времени уходит на каждое и применяется соответственно:

%timeit df.sort_values('Count', ascending=False).drop_duplicates(['Year'])
result: 917 µs ± 13 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.loc[df.groupby('Year')['Count'].agg('idxmax')]
result: 1.06 ms ± 5.97 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.loc[df.groupby('Year')['Count'].idxmax(), :]
result: 1.13 ms ± 23.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0 голосов
/ 09 октября 2018

Попробуйте это:

d = {'year': [1910, 1910, 1910,1920,1920,1920], 'name': ["Virginia", "Mary", "Elizabeth","Virginia", "Mary", "Elizabeth"], 'count': [848, 420, 747, 1048, 221, 147]}

df = pd.DataFrame(data=d)
df_results = pd.DataFrame(columns=df.columns)

years = pd.unique(df['year'])

for year in years:
    tmp_df = df.loc[df['year'] == year]
    tmp_df = tmp_df.sort_values(by='year')

    df_results = df_results.append(tmp_df.iloc[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...