我有一个看起来像这样的数据框:
我只希望保留每个组中连续的年份,例如下图,其中删除了A组中的2005年和B组中的2009年和2011年。
我使用builder.setNeedBle(true);
创建了一个年份差异列,然后仅保留年份差异等于1的行。
但是,此方法还将删除每个连续年份组中的第一行,因为第一行的年差为NAN。例如,将从组2000-2005中删除2000年。有什么办法可以避免这个问题?
答案 0 :(得分:6)
shift
获取OP最初的年度差异。然后检查是否等于1
或先前的值是1
yd = df.Year.groupby(df.group).diff().eq(1)
df[yd | yd.shift(-1)]
group Year
0 A 2000
1 A 2001
2 A 2002
3 A 2003
5 A 2007
6 A 2008
7 A 2009
8 A 2010
9 A 2011
10 B 2005
11 B 2006
12 B 2007
15 B 2013
16 B 2014
17 B 2015
18 B 2016
19 B 2017
Thx Jez
a = [('A',x) for x in range(2000, 2012) if x not in [2004,2006]]
b = [('B',x) for x in range(2005, 2018) if x not in [2008,2010,2012]]
df = pd.DataFrame(a + b, columns=['group','Year'])
答案 1 :(得分:4)
如果我正确理解,请使用diff
和cumsum
创建附加的组密钥,然后groupby
和您的组列,并将count
删除等于1。
df[df.g.groupby([df.g,df.Year.diff().ne(1).cumsum()]).transform('count').ne(1)]
Out[317]:
g Year
0 A 2000
1 A 2001
2 A 2002
3 A 2003
5 A 2007
6 A 2008
7 A 2009
8 A 2010
9 A 2011
10 B 2005
11 B 2006
12 B 2007
15 B 2013
16 B 2014
17 B 2015
18 B 2016
19 B 2017
数据
df=pd.DataFrame({'g':list('AAAAAAAAAABBBBBBBBBB',
'Year':[2000,2001,2002,2003,2005,2007,2008,2009,2010,2011,2005,2006,2007,2009,2011,2013,2014,2015,2016,2017])]})
答案 2 :(得分:0)
您可以有两列区别。一个是与下一行的区别,另一个是与上一行的区别。然后,您可以使用np.where过滤第一个差异为1或第二个差异为-1的列。
df=pd.DataFrame({'group':list('AAAAAAAAAABBBBBBBBBB'),'Year':[2000,2001,2002,2003,2005,2007,2008,2009,2010,2011,2005,2006,2007,2009,2011,2013,2014,2015,2016,2017]})
df['year_diff']=df.groupby(['group'])['Year'].diff()
df['year_diff2']=df.groupby(['group'])['Year'].diff(-1)
df['check']=np.where((df.year_diff==1) | (df.year_diff2==-1),True,False)
然后将df.check == False的所有行都删除。
这似乎是一个很长的方法,但是逻辑上遵循我认为的过程非常容易。