Python 3.x 在python中,将所有列中的所有负值替换为零

Python 3.x 在python中,将所有列中的所有负值替换为零,python-3.x,pandas,Python 3.x,Pandas,我在df以下 date T1 T2 T3 T4 1-1-2010 00:10 20 -5 4 3 1-1-2010 00:20 85 -78 34 21 1-1-2010 00:30 -45 22 31 75 1-1-2010 00:40 -6 5 7 -28 我想从第1列(T1列)开始将负值替换为零 我尝试了以下代码: df.iloc[:,1:].mask(df, 0) 但它也显示日期列的“0”值

我在df以下

date              T1   T2  T3  T4
1-1-2010 00:10    20   -5  4   3
1-1-2010 00:20    85  -78  34  21
1-1-2010 00:30    -45  22  31  75 
1-1-2010 00:40    -6   5   7  -28 
我想从第1列(T1列)开始将负值替换为零

我尝试了以下代码:

df.iloc[:,1:].mask(df, 0)
但它也显示日期列的“0”值

最终输出应为:

date              T1   T2  T3  T4
1-1-2010 00:10    20   0   4   3
1-1-2010 00:20    85   0   34  21
1-1-2010 00:30    0    22  31  75 
1-1-2010 00:40    0    5   7    0       

尝试用
df.iloc[:,1:<0

df.iloc[:,1:]=df.iloc[:,1:].mask(df.iloc[:,1:<0,0)
df=df1.iloc[:,1:]
df=df.面具(df使用:

输出:

             date  T1  T2  T3  T4
0  1-1-2010 00:10  20   0   4   3
1  1-1-2010 00:20  85   0  34  21
2  1-1-2010 00:30   0  22  31  75
3  1-1-2010 00:40   0   5   7   0
不仅样本中的
clip
mask
快,而且在更大的数据集中:

# Your sample -> 3x faster
%timeit df.iloc[:, 1:].clip(0)
# 1.74 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.iloc[:,1:].mask(df.iloc[:,1:] < 0, 0)
# 5.25 ms ± 573 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
#您的示例->快3倍
%timeit df.iloc[:,1::]片段(0)
#每个回路1.74 ms±115µs(7次运行的平均值±标准偏差,每个100个回路)
%timeit df.iloc[:,1::].mask(df.iloc[:,1::<0,0)
#每个回路5.25 ms±573µs(7次运行的平均值±标准偏差,每个100个回路)

#大样本->1000000个元素-->大约30倍
大_df=pd.DataFrame(pd.np.random.randint(-5,5,(1000,1000)))
%timeit大尺寸测向夹(0)
#每个回路17.2 ms±2.44 ms(7次运行的平均值±标准偏差,每个10个回路)
%timeit大测向掩码(大测向<0,0)
#每个回路498 ms±47 ms(7次运行的平均值±标准偏差,每个回路1次)

欢迎来到StackOverflow!您能像更新值列表一样更新
df
吗?使用
clip
的聪明方法!它从
df
中删除
date
             date  T1  T2  T3  T4
0  1-1-2010 00:10  20   0   4   3
1  1-1-2010 00:20  85   0  34  21
2  1-1-2010 00:30   0  22  31  75
3  1-1-2010 00:40   0   5   7   0
# Your sample -> 3x faster
%timeit df.iloc[:, 1:].clip(0)
# 1.74 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.iloc[:,1:].mask(df.iloc[:,1:] < 0, 0)
# 5.25 ms ± 573 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# Large Sample -> 1,000,000 elements --> about 30x
large_df = pd.DataFrame(pd.np.random.randint(-5, 5, (1000, 1000)))

%timeit large_df.clip(0)
# 17.2 ms ± 2.44 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit large_df.mask(large_df< 0, 0)
# 498 ms ± 47 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)