pandas 如何将数据框中的负数替换为包含其他数据类型以及零

9vw9lbht  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(126)

我试图找到一个解决方案,将 Dataframe 中的负数替换为0,在堆栈溢出(How to replace negative numbers in Pandas Data Frame by zero)中有一些建议。但大多数建议都是在 Dataframe 中只有一种数据类型的假设下工作的,比如float,所以当 Dataframe 中有字符和日期数据类型沿着float时,它就不起作用了。
是否可以只替换浮点/数字列,忽略日期类型,并将小于0的值替换为0?
有什么建议吗?
我正在使用的数据框如下所示:

{'ds': {'XYZ-100742': Timestamp('2023-01-01 00:00:00')}, 'X1': {'XYZ-100742': 101.0}, 'X2': {'XYZ-100742': 35.0}, 'X3': {'XYZ-100742': 33.0}, 'X4': {'XYZ-100742': 100.0}, 'X5': {'XYZ-100742': 101.0}, 'X6': {'XYZ-100742': 94.0}, 'X7': {'XYZ-100742': 116.0}, 'X8': {'XYZ-100742': 129.0}, 'X9': {'XYZ-100742': 108.0}, 'X10': {'XYZ-100742': -82.0}, 'X11': {'XYZ-100742': 47.0}, 'X12': {'XYZ-100742': 150.0}, 'X13': {'XYZ-100742': 129.0}, 'X14': {'XYZ-100742': 84.0}, 'X15': {'XYZ-100742': 48.0}, 'X16': {'XYZ-100742': -62.0}, 'X17': {'XYZ-100742': 150.0}, 'X18': {'XYZ-100742': -9.0}}

我写的代码,以解决这个问题如下:

import numpy as np
import pandas as pd
df = pd.read_excel ('C:/X/X/X/Book1.xlsx')
df[df<0]=0

这遇到了一个错误。我假设这是因为 Dataframe 中的数据类型不同。附件是错误:

**TypeError: '<' not supported between instances of 'str' and 'int'**
flvlnr44

flvlnr441#

DataFrame.clipDataFrame.select_dtypes一起用于数值列:

cols = df.select_dtypes(np.number).columns
df[cols] = df[cols].clip(lower=0)

备选方案:

df.update(df.select_dtypes(np.number).clip(lower=0))

或者使用DataFrame.mask

cols = df.select_dtypes(np.number).columns
df[cols] = df[cols].mask(df[cols] < 0, 0)

编辑:

Timestamp = pd.Timestamp
d = {'ds': {'XYZ-100742': Timestamp('2023-01-01 00:00:00')}, 'X1': {'XYZ-100742': 101.0}, 'X2': {'XYZ-100742': 35.0}, 'X3': {'XYZ-100742': 33.0}, 'X4': {'XYZ-100742': 100.0}, 'X5': {'XYZ-100742': 101.0}, 'X6': {'XYZ-100742': 94.0}, 'X7': {'XYZ-100742': 116.0}, 'X8': {'XYZ-100742': 129.0}, 'X9': {'XYZ-100742': 108.0}, 'X10': {'XYZ-100742': -82.0}, 'X11': {'XYZ-100742': 47.0}, 'X12': {'XYZ-100742': 150.0}, 'X13': {'XYZ-100742': 129.0}, 'X14': {'XYZ-100742': 84.0}, 'X15': {'XYZ-100742': 48.0}, 'X16': {'XYZ-100742': -62.0}, 'X17': {'XYZ-100742': 150.0}, 'X18': {'XYZ-100742': -9.0}}

df = pd.DataFrame(d)

cols = df.select_dtypes(np.number).columns
df[cols] = df[cols].clip(lower=0)
print (df)
                   ds     X1    X2    X3     X4     X5    X6     X7     X8  \
XYZ-100742 2023-01-01  101.0  35.0  33.0  100.0  101.0  94.0  116.0  129.0   

               X9  X10   X11    X12    X13   X14   X15  X16    X17  X18  
XYZ-100742  108.0  0.0  47.0  150.0  129.0  84.0  48.0  0.0  150.0  0.0

相关问题