Фильтровать фрейм данных pandas pandas путем сравнения строк

#python #pandas

#питон #панды

Вопрос:

У меня есть Df с для тестовых образцов, и некоторые из них были переделаны (переделаны), теперь я хочу отфильтровать только оригинальные

 col
a
b
a_redo
b_redo
c
d
e
f
g
g_redo
 

out

 col
a
b
g
 

это код, который я использую для фильтрации только образца повтора (_L _Q _S — это префикс повтора).

 sample[sample['col'].str.contains("_L|_Q|_S")]
 

Ответ №1:

Отфильтруйте только redo значения по Series.str.endswith , удалите их по Series.str.replace , а затем отфильтруйте исходные значения в столбце по Series.isin :

 vals = sample.loc[sample['col'].str.endswith("redo"), 'col'].str.replace('_redo','')
df = sample[sample['col'].isin(vals)]
print (df)
  col
0   a
1   b
8   g
 

С помощью вашей маски:

 vals = sample.loc[sample['col'].str.contains("_L|_Q|_S"), 'col'].str.replace("_L|_Q|_S",'')
df = sample[sample['col'].isin(vals)]
 

Ответ №2:

 mask_redo = sample['col'].str.contains("_L|_Q|_S")
mask_orig = - mask_redo
sample_orig = sample.loc[mask_orig]
 

По сути, помещая знак минус перед маской, которая выбирает строки, содержащие суффиксы повтора, вы инвертируете выделение: теперь у вас есть маска, которая выбирает строки, которые не содержат суффиксов повтора, то есть ваши исходные образцы.