这是我的数据框的子样本:
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个条件,每个类别一个。
有没有更快,更整洁的方法来实现这一目标?
非常感谢您。
答案 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
,