Python Pandas:获取具有最高价值的行

时间:2018-10-09 03:05:33

标签: python pandas

Dataframe

你好!我有一个数据帧,其中有年份(1910〜2014),名称,计数(每个名称的出现次数)作为列。我想创建一个新的数据框,以显示每年出现次数最多的名称,但是我不确定如何做到这一点。谢谢!

4 个答案:

答案 0 :(得分:1)

矢量化方式

group = df.groupby('year')
df.loc[group['count'].agg('idxmax')]

答案 1 :(得分:0)

尝试一下:

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])

答案 2 :(得分:0)

执行此操作的另一种方法是对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)

答案 3 :(得分:0)

我认为groupbyapply是个好方法:

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