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)