pandas 公差的计算

ca1c2owp  于 2023-01-19  发布在  其他
关注(0)|答案(2)|浏览(142)

我正在处理一个数据集。数据包含不同小数位的值。数据和代码如下所示:

data = {
         'value':[9.1,10.5,11.8,
                  20.1,21.2,22.8,
                  9.5,10.3,11.9,
                  ]
        }

df = pd.DataFrame(data, columns = ['value'])

它给出了以下 Dataframe :

value
0    9.1
1   10.5
2   11.8
3   20.1
4   21.2
5   22.8
6    9.5
7   10.3
8   11.9

现在,我想添加一个标题为adjusted的新列。我想使用numpy.isclose函数计算此列,容差为2(正负1)。最后,我希望得到下表所示的结果

value  adjusted
0    9.1        10
1   10.5        10
2   11.8        10
3   20.1        21
4   21.2        21
5   22.8        21
6    9.5        10
7   10.3        10
8   11.9        10

我尝试了这一行,但我得到的结果只有这样的真和假,而且这只是一个值(10),而不是所有的值。

np.isclose(df1['value'],10,atol=2)

有谁能帮我解决这个问题,用一行计算出10和21的公差吗?

kyks70gy

kyks70gy1#

如果只有两个不同的值,一种可能的解决方案是使用np.where

df['adjusted'] = np.where((df['value'] >= 8) & (df['value'] <= 12), 10, 21)
tjjdgumg

tjjdgumg2#

确切的逻辑和如何推广还不完全清楚。下面是两种选择。
假设你想根据一系列已定义的引用来测试你的值,你可以使用底层的numpy数组和broadcasting:

vals = np.array([10, 21])

a = df['value'].to_numpy()

m = np.isclose(a[:, None], vals, atol=2)

df['adjusted'] = np.where(m.any(1), vals[m.argmax(1)], np.nan)

假设你想对连续的值进行分组,你可以得到diff,并在差值超过阈值时开始一个新的组,然后得到round,并通过groupby.transform得到每组的中值:

group = df['value'].diff().abs().gt(2).cumsum()

df['adjusted'] = df['value'].round().groupby(group).transform('median')

输出:

value  adjusted
0    9.1      10.0
1   10.5      10.0
2   11.8      10.0
3   20.1      21.0
4   21.2      21.0
5   22.8      21.0
6    9.5      10.0
7   10.3      10.0
8   11.9      10.0

相关问题