Python 通过插入列标签从数据帧中选择序列
我有一个pandas数据框,其中包含多个位置(由坐标Python 通过插入列标签从数据帧中选择序列,python,pandas,Python,Pandas,我有一个pandas数据框,其中包含多个位置(由坐标x定义)不同时间步的值。我想创建一个pandas.Series对象,该对象包含所有时间步的给定位置x(因此数据帧的所有索引值)。如果x不是列标签之一,我想在两个最近的x值之间进行插值 数据帧对象的摘录(min(x)=0和max(x)=0.28): 我可以找到通过可用的列标签对数据帧进行切片的方法。但是有没有一种优雅的方法来进行插值呢 最后,我想要一个类似这样的函数:result=sliceDataframe(dataframe=dfin,x=0
x
定义)不同时间步的值。我想创建一个pandas.Series
对象,该对象包含所有时间步的给定位置x
(因此数据帧的所有索引值)。如果x
不是列标签之一,我想在两个最近的x
值之间进行插值
数据帧对象的摘录(min(x)=0
和max(x)=0.28
):
我可以找到通过可用的列标签对数据帧进行切片的方法。但是有没有一种优雅的方法来进行插值呢
最后,我想要一个类似这样的函数:
result=sliceDataframe(dataframe=dfin,x=0.01)
,结果是一个pandas.Series
对象,这样我就可以在另一个后处理脚本的一行(或者两行)中调用它了。我认为您最好自己编写一个简单的函数。比如:
def sliceDataframe(df, x):
# supposing the column labels are sorted:
pos = np.searchsorted(df.columns.values, x)
# select the two neighbouring column labels:
left = df.columns[pos-1]
right = df.columns[pos]
# simple interpolation
interpolated = df[left] + (df[right] - df[left])/(right - left) * (x - left)
interpolated.name = x
return interpolated
另一个选项是使用插值
方法,但因此,您应该添加一个带有所需标签的NAN列。具有上述功能:
In [105]: df = pd.DataFrame(np.random.randn(8,4))
In [106]: df.columns = df.columns.astype(float)
In [107]: df
Out[107]:
0 1 2 3
0 -0.336453 1.219877 -0.912452 -1.047431
1 0.842774 -0.361236 -0.245771 0.014917
2 -0.974621 1.050503 0.367389 0.789570
3 1.091484 1.352065 1.215290 0.393900
4 -0.100972 -0.250026 -1.135837 -0.339204
5 0.503436 -0.764224 -1.099864 0.962370
6 -0.599090 0.908235 -0.581446 0.662604
7 -2.234131 0.512995 -0.591829 -0.046959
In [108]: sliceDataframe(df, 0.5)
Out[108]:
0 0.441712
1 0.240769
2 0.037941
3 1.221775
4 -0.175499
5 -0.130394
6 0.154572
7 -0.860568
Name: 0.5, dtype: float64
使用插值
方法:
In [109]: df[0.5] = np.NaN
In [110]: df.sort(axis=1).interpolate(axis=1)
Out[110]:
0.0 0.5 1.0 2.0 3.0
0 -0.336453 0.441712 1.219877 -0.912452 -1.047431
1 0.842774 0.240769 -0.361236 -0.245771 0.014917
2 -0.974621 0.037941 1.050503 0.367389 0.789570
3 1.091484 1.221775 1.352065 1.215290 0.393900
4 -0.100972 -0.175499 -0.250026 -1.135837 -0.339204
5 0.503436 -0.130394 -0.764224 -1.099864 0.962370
6 -0.599090 0.154572 0.908235 -0.581446 0.662604
7 -2.234131 -0.860568 0.512995 -0.591829 -0.046959
In [111]: df.sort(axis=1).interpolate(axis=1)[0.5]
Out[111]:
0 0.441712
1 0.240769
2 0.037941
3 1.221775
4 -0.175499
5 -0.130394
6 0.154572
7 -0.860568
Name: 0.5, dtype: float64
我不想用一个虚构的点来调整数据帧。有没有办法在不添加列的情况下使用“插值”选项?如果没有,那么我想我会选择第一个解决方案。没有,熊猫插值方法总是在数据帧中填充NaN。但也许可以使用底层的scipy插值方法。但是,一旦选择了两个相邻的列,插值本身只是简单线性插值的一行,我不知道它是否值得使用。第一个选项工作良好,速度足够快,可以进行后处理。非常感谢。
In [109]: df[0.5] = np.NaN
In [110]: df.sort(axis=1).interpolate(axis=1)
Out[110]:
0.0 0.5 1.0 2.0 3.0
0 -0.336453 0.441712 1.219877 -0.912452 -1.047431
1 0.842774 0.240769 -0.361236 -0.245771 0.014917
2 -0.974621 0.037941 1.050503 0.367389 0.789570
3 1.091484 1.221775 1.352065 1.215290 0.393900
4 -0.100972 -0.175499 -0.250026 -1.135837 -0.339204
5 0.503436 -0.130394 -0.764224 -1.099864 0.962370
6 -0.599090 0.154572 0.908235 -0.581446 0.662604
7 -2.234131 -0.860568 0.512995 -0.591829 -0.046959
In [111]: df.sort(axis=1).interpolate(axis=1)[0.5]
Out[111]:
0 0.441712
1 0.240769
2 0.037941
3 1.221775
4 -0.175499
5 -0.130394
6 0.154572
7 -0.860568
Name: 0.5, dtype: float64