Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过插入列标签从数据帧中选择序列_Python_Pandas - Fatal编程技术网

Python 通过插入列标签从数据帧中选择序列

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

我有一个pandas数据框,其中包含多个位置(由坐标
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