首页 > 解决方案 > 在python中插入分类数据?(最近/前一个值)

问题描述

如何在 python 中插入分类(非浮点,或更广泛意义上的非数字)数据?

测试数据

这是一个带有字符串值 y 值的示例数据集。

x = [1.4, 2.8, 3.1, 4.4, 5.2]
y = ['A', 'B', 'A', 'A', 'B']

预期产出

# with kind= 'nearest'
x_new = [1, 2, 3, 4, 5]
y_new = ['A', 'A', 'A', 'A', 'B']

# with kind= 'previous', fill_value = None
x_new = [1, 2, 3, 4, 5]
y_new = [None, 'A', 'B', 'A', 'A']

我期待interp1dkind='nearest'可以使用or完成这项工作kind='previous',但不幸的是事实并非如此。

标签: pythoninterpolation

解决方案


interp1d如果您用索引替换目标点,您仍然可以使用。即构造所有唯一值的列表-在您的情况下,它将['A', 'B']转换y为索引而不是字符串(索引转换为浮点数-只要可以将唯一元素的数量存储为浮点数而不会丢失精度,就可以了)。

插值后,您只需要取回给定插值结果的元素。只要您使用“以前的”或“最近的”,您将始终获得浮点值,这是您的原始指标之一。

UPD。更简单的版本是使用y_int = [float(i) for i in range(len(y))], 作为 的输入interp1d,然后在获得插值结果后将其用作y.

例子:kind='nearest'

from scipy.interpolate import interp1d
import numpy as np

x = [1.4, 2.8, 3.1, 4.4, 5.2]
y = ['A', 'B', 'A', 'A', 'B']

f = interp1d(x, range(len(y)), kind='nearest', fill_value=(0, len(y)-1), bounds_error=False)
y_idx = f(x_new)
y_new = [y[int(i)] for i in y_idx ]
# ['A', 'A', 'A', 'A', 'B']

例子:kind='previous'

from scipy.interpolate import interp1d
import numpy as np

x = [1.4, 2.8, 3.1, 4.4, 5.2]
y = ['A', 'B', 'A', 'A', 'B']
f = interp1d(x, range(len(y)), kind='previous', fill_value=-1, bounds_error=False)
y_idx = f(x_new)
y_new = [y[int(i)] if i != -1 else None for i in y_idx]
# [None, 'A', 'B', 'A', 'A']

推荐阅读