python - 以 epsilon 精度将 Pandas DataFrame 条件转换为负数、零数和正数

标签 python pandas dataframe transformation

我想要一个由数值组成的数据框,根据该值是负数、零还是正数,将其转换为三个特定符号。此外,检查应该受到 epsilon 值的影响,以控制什么被视为零。

csv = pd.read_csv('filename.csv')
df = csv.iloc[:, :].diff()
df = df.iloc[1:,:] # remove the first row of nans

我尝试了以下方法

neg = df < -eps
zer = abs(df) <= eps
pos = df > eps
df[neg] = 'neg'
df[zer] = 'zer'
df[pos] = 'pos'

这工作了一段时间,但是当eps达到某个值时,抛出以下错误TypeError:无法对具有非np.nan值的混合类型进行就地 bool 设置

然后我尝试了以下操作:

df.transform(lambda x: ('neg' if x < -eps else 'zer') if abs(x) <= eps else 'pos')

结果错误 ValueError: ('Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 ', '发生在索引 0')

我有两个问题:

  1. 为什么只有当 eps 变大但适用于例如 eps = 0 时,我才会收到 TypeError?
  2. 如何执行此转换?

最佳答案

FWIW,我可能会使用 where 将接近零的值推至零,使用 np.sign 获得 0、1 和 - 的帧1、然后映射结果:

In [132]: df = pd.DataFrame(np.random.uniform(-1, 1, (5,5)))

In [133]: df
Out[133]: 
          0         1         2         3         4
0  0.108927 -0.728913 -0.369125 -0.670461  0.941319
1 -0.075262  0.412293  0.893267 -0.911717 -0.489222
2 -0.363191 -0.019171  0.541484  0.933258 -0.742260
3 -0.943218 -0.326041 -0.817188  0.339880  0.830269
4 -0.374525  0.895200 -0.792452 -0.725313  0.190894

In [134]: np.sign(df.where(df.abs() > 0.3, 0)).replace({0: "zer", 1: "pos", -1: "neg"})
Out[134]: 
     0    1    2    3    4
0  zer  neg  neg  neg  pos
1  zer  pos  pos  neg  neg
2  neg  zer  pos  pos  neg
3  neg  neg  neg  pos  pos
4  neg  pos  neg  neg  zer

关于python - 以 epsilon 精度将 Pandas DataFrame 条件转换为负数、零数和正数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715782/

相关文章:

python - 如何在python中替换多个字符串?

python - 正则表达式模式以匹配 python 中的日期时间

python - 在 pandas 数据框中连续组合不同列的值

python - 如何创建新的列名并从其他列的列表中填充行值

python - 使用 loc 更新 pandas 数据框中的行无法正常工作

dataframe - Pyspark:如何为另一列中具有相同值的所有行设置相同的id?

python - 如何检查一个数字是否已经在二维 numpy 数组的第一列中

python - 带有 Tensorflow (1.3) 后端的 Keras (2.0.8) 占用所有可用内存

python - 为什么以及由谁在 kivy 中调用这种方法

python - Pandas 根据其他列更改列值