从索引数据帧进行Python切片

从索引数据帧进行Python切片,python,pandas,dataframe,slice,Python,Pandas,Dataframe,Slice,我有以下数据框: Rec Channel Value1 Value2 Pre 10 20 Pre 35 42 Pre 42 90 Event A 23 39 FF 50 75 Post A 79 11 Post B 88 69 Post 55

我有以下数据框:

Rec  Channel  Value1  Value2 
Pre             10      20
Pre             35      42
Pre             42      90
Event    A      23      39
FF              50      75
Post     A      79      11
Post     B      88      69
Post            55      20
Post            62      34
Post            43      21
使用以下代码:

idxall = df[df['Chan'].isin({'A', 'B'})]
idx1 = idxall.iloc[[0]] #First Occurrance
idx2 = idxall.iloc[[-1]] #Last Occurrance
我希望能够在第一个通道读取上方的2个实例以及最后一个实例下方的2个实例中获取Value1列的一个片段,如果我希望基于Value1的列字符串读取它,那么该片段的语法将如何

期望输出:

Value 1
35
42
23
50
79
88
55
62
我尝试使用:

val1 = df.loc[idx1-2: idx2+2, 'Value1']
print(val1)
但我收到以下错误:TypeError:无法使用块值操作3-:“str”和“int”的操作数类型不受支持


有人能提出相应的建议吗

如果通道中缺少的值为NaN,可以使用

df.loc[(df['Channel'].shift(1).notnull()) & (df['Channel'].shift(-1).notnull()), 'Value1']

1    35
2    42
3    23
4    50
5    79
6    88
7    55
8    62

如果通道中缺少的值为NaN,则可以使用

df.loc[(df['Channel'].shift(1).notnull()) & (df['Channel'].shift(-1).notnull()), 'Value1']

1    35
2    42
3    23
4    50
5    79
6    88
7    55
8    62
使用并与
loc
和索引切片一起使用:

df.loc[df.Channel.first_valid_index()-2:df.Channel.last_valid_index()+2, 'Value1']
输出:

1    35
2    42
3    23
4    50
5    79
6    88
7    55
8    62
Name: Value1, dtype: int64
这种方法的问题在于,您正在将数据帧返回到idx和indx2,其中.loc正在寻找索引标签

要纠正方法,必须返回索引标签,即加减2

val1 = df.loc[idx1.index.values[0]-2: idx2.index.values[0]+2, 'Value1']
print(val1)
使用并与
loc
和索引切片一起使用:

df.loc[df.Channel.first_valid_index()-2:df.Channel.last_valid_index()+2, 'Value1']
输出:

1    35
2    42
3    23
4    50
5    79
6    88
7    55
8    62
Name: Value1, dtype: int64
这种方法的问题在于,您正在将数据帧返回到idx和indx2,其中.loc正在寻找索引标签

要纠正方法,必须返回索引标签,即加减2

val1 = df.loc[idx1.index.values[0]-2: idx2.index.values[0]+2, 'Value1']
print(val1)