python - 在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'
,但不幸的是事实并非如此。
解决方案
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']
推荐阅读
- javascript - 箭头功能被跳过
- vba - 定期将 Excel 中的串联数据复制到第二张工作表,而主工作表仍处于活动状态以进行数据输入
- r - 如何在R中的绘图中组合函数
- javascript - 修改 webRequest 的 onHeadersReceived 事件中的响应标头以启动“另存为”窗口
- r - 使用我当前的数据框重新排序在 ggplot 中不起作用
- .htaccess - 为静态 html 页面创建自定义 url
- c - 在另一个说明符中使用宽度说明符
- javascript - componentDidMount() 不工作但命中调试器
- python - python - 如何在python中分辨星期和天的日期差异?
- scala - 在转换中使用函数会导致不可序列化异常吗?