【问题标题】:How to find out the rows or columns all filled with zeros and delete them in pandas.DataFrame in python?python - 如何找出所有用零填充的行或列并在python的pandas.DataFrame中删除它们?
【发布时间】:2014-04-14 14:25:47
【问题描述】:

我有这样的pandas.DataFrame() 对象:

In [11]: df
Out[11]: 
   a  b
0  0  1
1  0  1
2  0  0
3  0  0
4  1  1

[5 rows x 2 columns]

我想删除所有用零填充的行:此处索引为 2 和 3 的行。

期望的输出:

In [12]: magic_func(df)
Out[12]: 
   a  b
0  0  1
1  0  1
4  1  1

[3 rows x 2 columns]

【问题讨论】:

  • def magic_func(s = 'Please help'): return 'What have you tried so far?'
  • @sshashank124 事实上,我想通了,想发布我的答案(和问题)来帮助别人。 :-) 但是在我问了之后,我发现我没有足够的声誉来立即回答。 :-( 用户 unutbu 现在已经分析了我的答案。

标签: python pandas


【解决方案1】:
df.loc[~(df == 0).all(axis=1)]

演示:

In [92]: df = pd.DataFrame({'a':[0,0,0,0,1], 'b':[1,1,0,0,1]})

In [93]: df
Out[93]: 
   a  b
0  0  1
1  0  1
2  0  0
3  0  0
4  1  1

[5 rows x 2 columns]

In [94]: (df == 0).all(axis=1)
Out[94]: 
0    False
1    False
2     True
3     True
4    False
dtype: bool

In [95]: df.loc[~(df == 0).all(axis=1)]
Out[95]: 
   a  b
0  0  1
1  0  1
4  1  1

[3 rows x 2 columns]

df[~df.isin([0]).all(axis=1)] 也可以:

In [108]: df[~df.isin([0]).all(axis=1)]
Out[108]: 
   a  b
0  0  1
1  0  1
4  1  1

但对于大型数据帧可能会更慢:

In [106]: df2 = pd.concat([df]*10000)

In [109]: %timeit df2.loc[~(df2 == 0).all(axis=1)]
100 loops, best of 3: 5.19 ms per loop

In [110]: %timeit df2[~df2.isin([0]).all(axis=1)]
10 loops, best of 3: 50.2 ms per loop

isin 在您需要针对大量值测试成员资格时很有用,但对于一个值而言,df == 0 更直接更快也就不足为奇了。

【讨论】:

  • 快速回答!事实上,我想通了,并想发布我的答案来帮助别人。但我的声望还不够……
  • 我的答案是df[~df.isin([0]).all(axis=axis)]。也许你的更快。
猜你喜欢
  • 2019-11-04
  • 1970-01-01
  • 2019-08-12
  • 2022-12-12
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2017-11-14
相关资源
最近更新 更多