通过列值列表过滤熊猫数据框

时间:2018-12-20 17:57:55

标签: python python-3.x pandas dataframe conditional-statements

这是我的数据框的子样本:

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个类别,所以我这样做了:

pd.DataFrame(sample.groupby(['codsprod']).size()).sort_values(by = 0,ascending = False).reset_index()[0:21]

产生:

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个条件,每个类别一个。

有没有更快,更整洁的方法来实现这一目标?

非常感谢您。

1 个答案:

答案 0 :(得分:2)

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

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

输出:

   idcontrn  ctosaldo    fecanota  diamovto    fecopera  codsprod
0    491748         0  2017-08-25         3  2017-08-25         0
2   1907630         0  2017-06-12     99999  2017-06-09        21
3   1573897         0  2018-01-25       613  2018-01-25         0
4   1713456         0  2017-08-08        17  2017-08-07         0
5    186315         0  2017-06-29        13  2017-06-28         0

说明:

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值的列表,要根据等于该列表中任何值的值过滤head(df) site1 Lon1 Lat1 site2 lon2 lat2 1 TN -64.33788 45.90501 BennettMeadow -72.47 42.68 3 TN -64.33788 45.90501 45.91:-64.34 -64.34 45.91 4 TN -64.33788 45.90501 45.9:-64.36 -64.36 45.90 5 TN -64.33788 45.90501 45.91:-64.35 -64.35 45.91 6 TN -64.33788 45.90501 45.89:-64.34 -64.34 45.89 7 TN -64.33788 45.90501 45.9:-64.32 -64.32 45.90 ,请使用.isin