Python Slicing из проиндексированного информационного кадра - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть следующий Dataframe ниже:

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

Я хотел бы иметь возможность взять фрагмент столбца Value1 для 2 экземпляроввыше чтения первого канала, а также на 2 экземпляра ниже последнего, каков будет синтаксис этого, если я захочу прочитать его на основе строки столбца Value1?

Желаемый вывод:

Value 1
35
42
23
50
79
88
55
62

Я пытался использовать:

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

Но получаю следующую ошибку: Ошибка типа: Не удалось обработать 3 со значениями блока, неподдерживаемыми типами операндов для -: 'str' и 'int'

Может кто-нибудь посоветовать соответственно?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Используйте 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)
0 голосов
/ 24 апреля 2018

Если пропущенные значения в канале - 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
...