我在python中有一个带有2列的数据框。我想用一栏输入数据框并获取第二栏的值。有时值可以是精确的,但也可以是2行之间的值。
我有这个示例数据框:
x y
0 0 0
1 10 100
2 20 200
如果我用x的值检查数据帧,我想找到y的值。例如,如果我在数据框中输入的值为10,则得到的值为100。但是,如果我检查为15,则需要在y的两个值之间进行插值。有功能吗?
答案 0 :(得分:1)
您可以查看interpolate
模块(doc)中提供的Pandas
方法。但我不确定是否能回答您的问题。
您可以使用interp1d
模块中的sklearn
来完成此操作。插值有几种类型:“线性”,“最近”,“零”,“线性”,“二次”,“三次” ...您可以在(doc page)上找到列表。
插值过程可以概括为三个步骤:
isna
(doc) interp1d
(doc) x
)上调用第2步中的函数find。代码在这里:
# Import modules
import pandas as pd
import numpy as np
from scipy.interpolate import interp1d
# Data
df = pd.DataFrame(
[[0, 0],
[10, 100],
[11, np.NaN],
[15, np.NaN],
[17, np.NaN],
[20, 200]],
columns=["x", "y"])
print(df)
# x y
# 0 0 0.0
# 1 10 100.0
# 2 11 NaN
# 3 15 NaN
# 4 17 NaN
# 5 20 200.0
# Split data in training (not NaN values) and missing (NaN values)
missing = df.isna().any(axis=1)
df_training = df[~missing]
df_missing = df[missing].reset_index(drop=True)
# Create function that interpolate missing value (from our training values)
f = interp1d(df_training.x, df_training.y)
# Interpolate the missing values
df_missing["y"] = f(df_missing.x)
print(df_missing)
# x y
# 0 11 110.0
# 1 15 150.0
# 2 17 170.0
您可以在此link上找到有关该主题的其他著作。
答案 1 :(得分:1)
vector
可能是线性插值的最简单方法:
&
通过您的示例数据可以得出:
DT[DT[, Reduce(`&`, Map(`==`, .SD, DF$X2)),.SDcols = as.character(DF$X1)]]
# x y v
#1: a 3 2
您甚至可以直接这样做:
numpy.interp