按列值列表筛选pandas数据帧

2024-10-03 15:32:28 发布

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

这是我的数据帧的子示例:

idcontrn    ctosaldo    fecanota    diamovto    fecopera    codsprod
491748      000         2017-08-25         3    2017-08-25         0
1014320     000         2018-05-28     99999    2018-05-28        33
1907630     000         2017-06-12     99999    2017-06-09        21
1573897     000         2018-01-25       613    2018-01-25         0
1713456     000         2017-08-08        17    2017-08-07         0
186315      000         2017-06-29        13    2017-06-28         0
150328      000         2017-10-23         1    2017-10-23        84
1531535     000         2017-04-25         1    2017-04-25        78

我想从“codsprod”专栏中按出现次数列出的前20个最常见的类别,所以我这样做了:

^{pr2}$

结果是:

codsprod    0
0   0   319971
1   76  120026
2   33  62017
3   119 48138
4   14  42180
5   104 40756
6   48  26902

等等。。。直到20号。在

现在我要做的是根据“codsprod”列的前20个类别过滤原始的df。我知道如何根据条件对pandas df应用过滤器,但写的内容如下:

sample[sample['codsprod'] == category_number]对我来说似乎是乏味而漫长的,因为我需要手动建立20个条件,每个类别一个。在

有没有一种更快更简洁的方法来实现这个目标??在

事先非常感谢。在


Tags: 数据sample示例df条件类别次数专栏
1条回答
网友
1楼 · 发布于 2024-10-03 15:32:28

使用groupby+size+head得到最大的'codsprod'组。使用.isin过滤原始的DataFrame。要获取最大的两个组:

df[df.codsprod.isin(df.groupby('codsprod').size().head(2).index)]

输出:

^{pr2}$

说明:

df.groupby('codsprod').size()返回一个Series,该值根据组大小按降序排序。这个Series的值是组大小,这个Series的索引是相应的'codsprod'值:

df.groupby('codsprod').size()
#codsprod
#0     4
#21    1
#33    1
#78    1
#84    1
#dtype: int64

获取.head(n)将只返回顶部的n记录,在本例中,这是n最大的组。但请注意,它不处理关系,它只需要先出现的任何内容(这将不会太难包含任何关系也):

df.groupby('codsprod').size().head(2)
#codsprod
#0     4
#21    1
#dtype: int64

在这一点上,你不在乎群体有多大,你想知道哪个群体最大。所以你需要这个系列的指数。在

df.groupby('codsprod').size().head(2).index
#Int64Index([0, 21], dtype='int64', name='codsprod')

这基本上是一个'codsprod'值的列表,并根据值等于列表中使用的^{}来过滤DataFrame

相关问题 更多 >