我在下面有以下数据框:
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个实例的Value1列以及最后一个实例之下的2个实例,如果我想基于它读取它的语法将如何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'
有人可以据此提出建议吗?
答案 0 :(得分:1)
如果Channel中的缺失值是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
答案 1 :(得分:1)
使用first_valid_index
和last_valid_index
与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)