我有这个数据框:
person_code type growth size ...
0 . 231 32 0.54 32
1 . 233 43 0.12 333
2 . 432 32 0.44 21
3 . 431 56 0.32 23
4 . 654 89 0.12 89
5 . 764 32 0.20 211
6 . 434 32 0.82 90
...
(这个数据框非常大,我在这里进行了简化)
我想为每种类型创建一个数据框,其中3个具有更高“增长”的人,按其排序。我希望能够按类型调用它。在这种情况下,让我们使用类型32,因此输出df应如下所示:
person_code type growth size ...
6 . 434 32 0.82 90
0 . 231 32 0.54 32
2 . 432 32 0.44 21
...
我知道这会是使用groupby的东西:
groups=dataframe.groupby('type')
但是如何使用类型为32的行调用groupby对象? 什么是最好的只能通过增长来分离前三名?
答案 0 :(得分:2)
IIUC,您不需要分组,只需query
过滤数据框然后nlargest
:
df.query('type == 32').nlargest(3, 'growth')
并且,要参数化'键入'输入,您可以使用以下语法:
in_type = 32
df.query('type == @in_type').nlargest(3, 'growth')
输出:
person_code type growth size
6 . 434 32 0.82 90
0 . 231 32 0.54 32
2 . 432 32 0.44 21
或者如果您想使用groupby,您可以使用查询来获取您需要的类型。
type_group_df = df.groupby('type', group_keys=False)\
.apply(pd.DataFrame.nlargest,n=3,columns='growth')
要调用它,您可以使用:
type_group_df.query('type == 32')
如果你有一个类型的字符串,它将如下所示:
type_group_df.query('type == "brazilian"')
但是,如果你的专栏名称以任何形式开头都是特殊字符,例如'#',你应该使用它:
type_group_df[type_group_df['#type'] == 32]
输出:
person_code type growth size
6 . 434 32 0.82 90
0 . 231 32 0.54 32
2 . 432 32 0.44 21
查询另一种类型(43):
type_group_df.query('type == 43')
输出:
person_code type growth size
1 . 233 43 0.12 333
答案 1 :(得分:1)
您可以同时为所有type
执行此操作:
df.groupby('type').apply(lambda dft: dft.nlargest(3, 'growth'))
返回
person_code type growth size
type
32 6 434 32 0.82 90
0 231 32 0.54 32
2 432 32 0.44 21
43 1 233 43 0.12 333
56 3 431 56 0.32 23
89 4 654 89 0.12 89
答案 2 :(得分:1)
喜欢什么?
df.sort_values(['type','person_code']).groupby('type').head(3)
Out[184]:
person_code type growth size
0 231 32 0.54 32
2 432 32 0.44 21
6 434 32 0.82 90
1 233 43 0.12 333
3 431 56 0.32 23
4 654 89 0.12 89
答案 3 :(得分:1)
查找每个组的前3个增长值的索引,并将1级索引提供给.loc
。
idx = df.groupby("type")["growth"].nlargest(3).index
# MultiIndex(levels=[[32, 43, 56, 89], [0, 1, 2, 3, 4, 6]],
# labels=[[0, 0, 0, 1, 2, 3], [5, 0, 2, 1, 3, 4]],
# names=['type', None])
dftop3 = df.loc[idx.get_level_values(1)]
person_code type growth size
6 434 32 0.82 90
0 231 32 0.54 32
2 432 32 0.44 21
1 233 43 0.12 333
3 431 56 0.32 23
4 654 89 0.12 89
dftop3[dftop3.type == 32]
person_code type growth size
6 434 32 0.82 90
0 231 32 0.54 32
2 432 32 0.44 21