2017-01-23 3 views
1

Теперь у меня есть dataframe нижеКак извлечь некоторую строку в вертикальном состоянии в панд dataframe

A B C 
1 a 0 6 
1 b 1 5 
1 c 0 8 
1 d 0 9 
2 e 0 1 
2 f 1 2 
2 g 0 3 
3 h 0 4 
3 i 0 5 
3 j 0 6 

во-первых, я хотел бы извлечь df.B == 1

A B C 
1 b 1 5 
2 f 1 2 

во-вторых, я бы например, для извлечения строки вокруг числа столбцов C (+ -1, в этом случае строка c 0 8 находится рядом с b 1 5, но число df.C = 8, поэтому этот столбец будет отброшен. Если df. C = 4or6 эта строка будет добавлена) Не имеет значения, находятся ли они рядом друг с другом или нет.

A B C 
1 a 0 6 
1 b 1 5 
2 e 0 1 
2 f 1 2 
2 g 0 3 

Я хочу получить информационную рамку выше. Как я могу это сделать?

Сначала я попытался

df[df.B==1] 

Но я не мог понять, следующий шаг ..

+1

Ваш желаемый результат для части 2, по-видимому, не соответствует вашему исходному фреймворку данных - e, 0,1 строка становится e, 0,4 (выходы части 1 тоже не соответствуют), и это не так ясно, что означает «вокруг числа столбцов С». Не могли бы Вы уточнить? – DSM

+0

Извините, я только что отредактировал ... – Heisenberg

+0

Вы приняли ответ, который включает в себя строку '1 c 0 8' на выходе, но ее нет в вашем желаемом выходе. Зачем? – DSM

ответ

2
# find where `B` is one 
bs = np.where(df.B.values == 1)[0] 

# union `bs` with + 1 and - 1 
idx = np.unique(np.concatenate([bs - 1, bs, bs + 1])) 

# don't go below zero or above last row 
idx = idx[(0 <= idx) & (idx < len(df))] 

# use `iloc` to index correct rows 
df.iloc[idx] 

    A B C 
1 a 0 6 
1 b 1 5 
1 c 0 8 
2 e 0 1 
2 f 1 2 
2 g 0 3 
+0

благодарим вас за сотрудничество! Я хотел бы, чтобы строка, число которой не columnC, находится рядом с строкой первого шага (а не индексом) – Heisenberg

1

хорошо его немного запутанным (специально, так как и изменил номера из первого примера на второй к третьему), но из того, что я понял, вы хотите получить все ряды с:

B==1 

и из этих строки, вы хотите получить строки с равным индексом и C + -1 из C одного с B == 1
(пожалуйста, исправьте меня, если я ошибаюсь)

Я бы сделал это следующим образом:

быть ДФ = оригинал dataframe

DF = pd.DataFrame([], columns=['A','B','C']) 

index_list = [] 

for i in np.arange(len(df)): 

    ref_index = df.index[i] 

    if df.iloc[i]['B'] == 1: 

     DF.loc[len(DF)] = df.iloc[i] 
     index_list.append(df.index[i]) 

    if df.iloc[i]['B'] == 0: 

     try: 

      ref_C = df[df['B']==1].loc[ df.index[i]]['C'] 

     except: 

      ref_C = np.nan 

     if ((df.iloc[i]['C'] == ref_C + 1)|(df.iloc[i]['C'] == ref_C - 1)): 

     DF.loc[len(DF)] = df.iloc[i] 
     index_list.append(df.index[i])    

DF.index = index_list 

надежда, что это, если это помогает upvote/проверить ответ, мир мат!

Смежные вопросы