Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:如果多个列中有多个为零,则删除行_Python_Pandas - Fatal编程技术网

Python 熊猫:如果多个列中有多个为零,则删除行

Python 熊猫:如果多个列中有多个为零,则删除行,python,pandas,Python,Pandas,我有这样一个数据帧: col0 col1 col2 col3 ID1 0 2 0 2 ID2 1 1 2 10 ID3 0 1 3 4 我想多次删除包含零的行 我试着做: cols = ['col1', etc] df.loc[:, cols].value_counts() 但这只适用于系列,而不适用于数据帧 df.loc[:, cols].count(0) <= 1 d

我有这样一个数据帧:

     col0   col1  col2  col3
ID1    0      2     0     2
ID2    1      1     2     10
ID3    0      1     3     4
我想多次删除包含零的行

我试着做:

cols = ['col1', etc]
df.loc[:, cols].value_counts()
但这只适用于系列,而不适用于数据帧

df.loc[:, cols].count(0) <= 1

df.loc[:,cols].count(0)应用条件并计算
True

(df == 0).sum(1)

ID1    2
ID2    0
ID3    1
dtype: int64

df[(df == 0).sum(1) < 2]

     col0  col1  col2  col3
ID2     1     1     2    10
ID3     0     1     3     4

df=pd.concat([df]*10000,忽略索引=True)
%timeit df[(df==0).sum(1)<2]
%timeit df[df.astype(bool.sum)(1)>len(df.columns)-2]
%timeit df[np.count\u非零(df.values,axis=1)>len(df.columns)-2]
每个回路7.13 ms±161µs(7次运行的平均值±标准偏差,每个100个回路)
每个回路4.28 ms±120µs(7次运行的平均值±标准偏差,每个100个回路)
每个回路997µs±38.2µs(7次运行的平均值±标准偏差,每个1000个回路)

应用条件并计算
真值

(df == 0).sum(1)

ID1    2
ID2    0
ID3    1
dtype: int64

df[(df == 0).sum(1) < 2]

     col0  col1  col2  col3
ID2     1     1     2    10
ID3     0     1     3     4

df=pd.concat([df]*10000,忽略索引=True)
%timeit df[(df==0).sum(1)<2]
%timeit df[df.astype(bool.sum)(1)>len(df.columns)-2]
%timeit df[np.count\u非零(df.values,axis=1)>len(df.columns)-2]
每个回路7.13 ms±161µs(7次运行的平均值±标准偏差,每个100个回路)
每个回路4.28 ms±120µs(7次运行的平均值±标准偏差,每个100个回路)
每个回路997µs±38.2µs(7次运行的平均值±标准偏差,每个1000个回路)
使用

df.loc[df.eq(0).sum(1).le(1),]
     col0  col1  col2  col3
ID2     1     1     2    10
ID3     0     1     3     4
有趣的方式

df.mask(df.eq(0)).dropna(0, thresh=df.shape[1] - 1).fillna(0)
     col0  col1  col2  col3
ID2   1.0     1   2.0    10
ID3   0.0     1   3.0     4    
使用

有趣的方式

df.mask(df.eq(0)).dropna(0, thresh=df.shape[1] - 1).fillna(0)
     col0  col1  col2  col3
ID2   1.0     1   2.0    10
ID3   0.0     1   3.0     4    

不错。如果我想进一步限制列检查,我可以做
df[(df[my_cols]==0)。sum(1)<2]
,对吗?假设我有一个更大的数据集开始with@PeptideWitch是的,那就足够了。那里的方法很有趣——我很喜欢那一种。对我的数据集很好用。如果我想进一步限制列检查,我可以做
df[(df[my_cols]==0)。sum(1)<2]
,对吗?假设我有一个更大的数据集开始with@PeptideWitch是的,那就足够了。那里的方法很有趣——我很喜欢那一种。适用于我的数据集Too是否使用
loc
to?方法#1可以工作,但只返回数据集的ID,因此您必须将其包装在一个条件中,以过滤掉数据帧。不过,答案还是很简洁。Ty:)是否使用
loc
to?方法#1起作用,但只返回数据集的ID,因此您必须将其包装在一个条件中,以过滤掉数据帧。不过,答案还是很简洁。泰:)
df.mask(df.eq(0)).dropna(0, thresh=df.shape[1] - 1).fillna(0)
     col0  col1  col2  col3
ID2   1.0     1   2.0    10
ID3   0.0     1   3.0     4    
df.replace(0, np.nan, inplace=True)
df.dropna(subset=df.columns, thresh=2, inplace=True)
df.fillna(0., inplace=True)