仅选择序列组

时间:2016-04-10 17:24:03

标签: python algorithm pandas dataframe

我的数据集已根据下面的pandas数据框进行排序和过滤;

name id     id2 year    sales   seq
a    00632  00  2006    200.00  0
a    00632  00  2007    380.00  1
a    00632  00  2010    73.00   2
a    00632  00  2011    147.00  3
a    00632  00  2012    80.00   4

b    00003  00  2009    153.00  0
b    00003  00  2010    390.00  1
b    00003  00  2011    730.00  2
b    00003  00  2012    312.00  3
b    00003  00  2013    179.00  4

我在制定如何隔离非连续年份时遇到了麻烦。我只返回一个数据集;

a    00632  00  2010    73.00   2
a    00632  00  2011    147.00  3
a    00632  00  2012    80.00   4

b    00003  00  2009    153.00  0
b    00003  00  2010    390.00  1
b    00003  00  2011    730.00  2
b    00003  00  2012    312.00  3
b    00003  00  2013    179.00  4

逻辑基本上是按名称删除记录,其中年份不如3年。

因此,对于以下记录将被删除,因为它们仅连续2年。

name id     id2 year    sales   seq
a    00632  00  2006    200.00  0
a    00632  00  2007    380.00  1 

我希望这是有道理的,因为我在试图找出这种逻辑的算法时遇到了麻烦。

1 个答案:

答案 0 :(得分:1)

分两步进行。

我认为df'id','year'排序。

首先,找到第+ + 2行所在的行,每行'id'

In [15]: firstyears=(df.groupby('id')['year'].shift(-2)-df['year'])==2
# [ False False  True False False | True  True  True False False ]

使用逻辑或(|)运算符选择好行。 firstyears.shift(1)将选择下一年,firstyears.shift(2) 下一个

In [16]: df.loc[ firstyears | firstyears.shift(1) | firstyears.shift(2) ]
Out[16]: 
  name   id  id2  year  sales  seq
2    a  632    0  2010     73    2
3    a  632    0  2011    147    3
4    a  632    0  2012     80    4
5    b    3    0  2009    153    0
6    b    3    0  2010    390    1
7    b    3    0  2011    730    2
8    b    3    0  2012    312    3
9    b    3    0  2013    179    4
相关问题