Python从索引数据帧切片

时间:2018-04-24 17:39:20

标签: 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      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'

有人可以据此提出建议吗?

2 个答案:

答案 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_indexlast_valid_indexloc和索引切片:

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)