我有一个数据框,我想在其中删除所有全零的所有行。
df = pd.DataFrame(data={
'a': [0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0],
'b': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'c': [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0],
'd': [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
'e': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'f': [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
})
使用.ix,我会df.ix[(df>0).any(1)]
a b c d e f
1 0 0 0 0 0 1
5 0 0 5 0 0 0
6 1 0 0 0 0 0
8 0 0 0 1 0 0
9 1 0 0 0 0 0
以获得正确的输出,但是当我尝试使用iloc时,它会给我iLocation based boolean indexing on an integer type is not available
。我正在尝试使用iloc,因为ix现在已贬值。
df.iloc[(df>0).any(1)]
答案 0 :(得分:3)
删除iloc
df[(df>0).any(1)] # or df.loc[(df>0).any(1)]
Out[185]:
a b c d e f
1 0 0 0 0 0 1
5 0 0 5 0 0 0
6 1 0 0 0 0 0
8 0 0 0 1 0 0
9 1 0 0 0 0 0
答案 1 :(得分:0)
或者,您可以迭代df行并检查所有行值是否等于0。如果是这种情况,则删除相应的行。例如:
for index, row in df.iterrows():
if (all(values == 0 for values in row.values)):
df=df.drop(index)
上面的代码产生所需的输出。
答案 2 :(得分:0)
这里不需要使用.iloc
,只需使用df[(df>0).any(1)]
,它就会为您提供所需的输出。
但是,如果您想使用.iloc
进行操作,请执行以下操作:
您想做的是将熊猫系列对象传递给.iloc
,从而出错。
将熊猫系列转换为列表1,然后传递到.iloc
,即>> >> p
df.iloc[list((df>0).any(1))]