我需要帮助截断数据框架内的小数列,这与其他计算相关联,以输出1或0二进制列,称为"scenario "。该数据框有20多个列。
在这种情况下,我有两列(A列和B列)的小数沿着一个基于时间的索引。列可以有不同数量的小数点,并且在前面的行中有NaN值。
我试图截断值只有这两个列用于计算和"扔掉",不改变原来的列或生成新的列。
。ColA可为4位小数,ColB可为6位小数
您可以使用numpytrunc
:
df = pd.DataFrame({'ColA ': [0.9954, 0.9854], 'ColB': [0.995642, 0.99745]})
np.trunc(10 * df) / 10
结果:
ColA ColB
0 0.9 0.9
1 0.9 0.9
我认为最简单的方法是使用applymap与数学模块的truncate函数配对。下面是一个例子:
trunc = lambda x: math.trunc(10 * x)/10
df.applymap(trunc)
您需要将此应用于您感兴趣的列,但我在一些任意示例上测试了它,并且它运行良好。希望这对你有帮助!如有必要,可详加说明。
你也可以使用正则表达式:
df = pd.DataFrame({'ColA ': [0.99989, 0.986767], 'ColB': [0.9890, 0.9588]})
func = lambda x: re.match(r'd+.d{1}', str(x)).group(0)
df.applymap(func)
或者这里有一个不那么优雅的方法,你首先将数字转换成字符串,然后你分别得到字符串的不同部分,最后将字符串转换回浮点数(是的,这是不有效的):
def func(x):
# Convert number to a string
digits = str(x).split(".")
# Manually put the number back together:
digit = digits[0] + "." + digits[1][:1]
return float(digit)
df.applymap(func)
结果:
ColA | ColB
0.9 | 0.9
0.9 | 0.9