当特定列的连续行值大于数字时,大熊猫将删除行

时间:2020-07-06 13:02:11

标签: python pandas dataframe

我有一个这样的数据框,

col1    col2 
  A      1
  B      2
  C      3
  D      3
  E      3
  F      4
  G      5
  H      5
  I      5
  J      5

现在,我想删除连续的col2值大于3倍的那些行,在上面的数据框中,5的col2值出现了3次以上,因此应删除这些行。所以最终的数据帧应该看起来像

col1    col2 
 A      1
 B      2
 C      3
 D      3
 E      3
 F      4     

我可以使用带有计数器签入的for循环来执行此操作,但是执行时间会更长。寻找一些有效的pythonic方式/熊猫捷径。

2 个答案:

答案 0 :(得分:1)

Series.value_countsSeries.map一起用于计数值,然后在Series.le中用boolean indexing进行小于或等于的过滤:

df = df[df['col2'].map(df['col2'].value_counts()).le(3)]
print (df)
  col1  col2
0    A     1
1    B     2
2    C     3
3    D     3
4    E     3
5    F     4

对于测试连续值,将辅助器SeriesSeries.shiftSeries.cumsum一起使用,并传递到GroupBy.transform(并在其后指定列):

g = df['col2'].ne(df['col2'].shift()).cumsum()
df = df[df.groupby([g,'col2'])['col2'].transform('size').le(3)]
print (df)
  col1  col2
0    A     1
1    B     2
2    C     3
3    D     3
4    E     3
5    F     4

答案 1 :(得分:1)

要标识连续值,通常需要cumsum上的差异和分组依据:

groups = df.col2.ne(df.col2.shift()).cumsum()

group_sizes = df.groupby(groups).transform('size')

out = df[group_sizes <= 3)