python-3.x - 在python中用零替换所有列中的所有负值

标签 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 

我想从第一列(从 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       

最佳答案

使用pandas.DataFrame.clip :

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

不仅在您的示例中,clipmask 更快,而且在更大的数据集中也更快:

# 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/

相关文章:

python - Pandas 滚动相关计算中的数值稳定性问题

Python str.contains 其他列相关的函数

python - Pandas :从csv文件中获取特定列

python - 如何使 python 数据类可哈希?

Python:只要组包含任何特定值,如何过滤数据

python - 如何使用 Python 读取包含扩展字体的 Excel 文件? (openpyxl 错误 : Max value is 14)

python - pandas:将DataFrame最后一行除以第一行

python - 计算数据框中一行的百分比值

python - 改进模板标签的功能 - Django

json - Python - UnicodeDecodeError : 'charmap' codec can't decode byte 0x81 in position 44: character maps to <undefined>