我有以下 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
我想从第一列(从 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:] = df.iloc[:, 1:].clip(0)
print(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)
# 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)
关于python-3.x - 在python中用零替换所有列中的所有负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58553613/