У меня есть данные, как показано ниже. Я хотел бы выбрать строки на основе двух условий.
1) строки, начинающиеся с цифр (1,2,3 и т. д.)
2) предыдущая строка записей, удовлетворяющих 1-му условию
Пожалуйста, найдите, как выглядят входные данные
Пожалуйста, найдите, как я ожидаю, что результат будет
Я пытался использовать функцию сдвига (-1), но, похоже, она выдает ошибку. Я уверен, что перепутал логику/синтаксис. Пожалуйста, найдите код ниже, который я пробовал
# i get the index of all records that start with number.
s=df1.loc[df1['VARIABLE'].str.contains('^\d')==True].index
# now I need to get the previous record of each group but this is
#incorrect
df1.loc[((df1['VARIABLE'].shift(-1).str.contains('^\d')==False) &
(df1['VARIABLE'].str.contains('^\d')==True))].index
Использовать:
df1 = pd.DataFrame({'VARIABLE':['studyid',np.nan,'age_interview','Gender','1.Male',
'2.Female',np.nan, 'dob', 'eth',
'Ethnicity','1.Chinese','2.Indian','3.Malay']})
#first remove missing rows by column VARIABLE
df1 = df1.dropna(subset=['VARIABLE'])
#test startinf numbers
s = (df1['VARIABLE'].str.contains('^\d'))
#chain shifted values by | for OR
mask = s | s.shift(-1)
#filtering by boolean indexing
df1 = df1[mask]
print (df1)
VARIABLE
3 Gender
4 1.Male
5 2.Female
9 Ethnicity
10 1.Chinese
11 2.Indian
12 3.Malay
ваши комментарии будут полезны. Когда я применяю это к большому набору данных, он игнорирует значения False и выбирает только соответствующие записи со значением True.
в операции сдвига по цепочке возвращает ли True + Nan True? Я вижу, что результат равен True, но можете ли вы поделиться какой-либо ссылкой, где я могу прочитать это сравнение между логическим значением и значением Nan. 2) Можете ли вы также сообщить мне, как df1 [маска] возвращает 6 записей, соответствующих значению «Истина». Я понимаю, что «маска» из-за операции сдвига цепи имеет 6 «истинных» записей. Как, когда я использую эту маску в качестве ключа к df1, возвращает соответствующие 6 записей. Он использует индекс?