删除3个或更多列为0的记录

时间:2018-04-16 00:33:45

标签: python pandas

我有一个有很多0的数据帧,就像下面的df示例一样。我想删除三列或更多列中包含0的任何行,如下面的示例Resultdf。

下面的脚本将删除所有0

的记录
dataTheFlash <- read.csv(
  paste(strWF,"B_Allen_Is.txt",sep=""),  
  header = TRUE,
  sep=";",
  stringsAsFactors=FALSE,
  colClasses = c('name_of_column'='character')
)

有没有办法对它进行修改,以便删除全部为0的记录,或者有三列或多列为0的记录?或者还有另一种方法吗?

print df:

df = df[(df.T != 0).any()]

打印Resultdf:

ind_key prtCnt fldCnt TmCnt bmCnt
1       0      0      0     0
2       2      0      0     3
3       0      1      0     0
4       0      1      1     0

3 个答案:

答案 0 :(得分:6)

您可以将sumaxis = 1

一起使用
df[df.eq(0).sum(1)<3] # eq mean '=='
Out[523]: 
   ind_key  prtCnt  fldCnt  TmCnt  bmCnt
1        2       2       0      0      3
3        4       0       1      1      0

答案 1 :(得分:2)

使用惯用dropna并设置thresh标志:

df[df != 0].dropna(thresh=len(df.columns) -  2, axis=0)

   ind_key  prtCnt  fldCnt  TmCnt  bmCnt
1        2     2.0     NaN    NaN    3.0
3        4     NaN     1.0    1.0    NaN

答案 2 :(得分:2)

巧妙使用numpy.argpartition。我们从一个不等于零的布尔数组开始。然后我们将每一行分成三个最低值,其余的。如果至少有3个零,那么前三个元素中的所有元素都将返回false。

df[~(df.values != 0).argpartition(3, 1)[:, :3].all(1)]

   ind_key  prtCnt  fldCnt  TmCnt  bmCnt
1        2       2       0      0      3
3        4       0       1      1      0