2017-01-24 3 views
3

Как фильтровать строки, в столбце которых находится другой столбец? Например, если у нас есть DT с двумя столбцами A, B, мы можем фильтровать строки с B.contains (A)? Не только если B содержит некоторые значения A от всех A от DT, но только в одной строке.Pandas, строки фильтров, в столбце которых находится другой столбец

 
A  B 
'lol' 'lolec' 
'ram' 'rambo' 
'ki' 'pio' 

Result: 
A  B 
'lol' 'lolec' 
'ram' 'rambo' 
+0

Что выводится, если значения '' lolec' и pio' является поменять местами? – jezrael

+0

Тогда в результате будет только вторая строка. –

+0

Спасибо, см. Мой ответ. – jezrael

ответ

1

Вы можете использовать boolean indexing с маской, созданной apply и in при необходимости фильтр столбцов A и B в строках:

#if necessary strip ' in all values 
df = df.apply(lambda x: x.str.strip("'")) 
#df = df.applymap(lambda x: x.strip("'")) 

print (df.apply(lambda x: x.A in x.B, axis=1)) 
0  True 
1  True 
2 False 
dtype: bool 

df = df[df.apply(lambda x: x.A in x.B, axis=1)] 
print (df) 
    A  B 
0 lol lolec 
1 ram rambo 

Отличие решений - вход DataFrame изменен:

print (df) 
    A  B 
0 lol pio 
1 ram rambo 
2 ki lolec 

print (df[df.apply(lambda x: x.A in x.B, axis=1)]) 
    A  B 
1 ram rambo 

print (df[df['B'].str.contains("|".join(df['A']))]) 
    A  B 
1 ram rambo 
2 ki lolec 
+0

Спасибо, это полезно. У меня мало проблем с кодировкой. Кодировка всегда была большой проблемой для python 2.7 для меня. –

+0

Возможно ли переход на python 3? Я переключился 6 месяцев назад, и это было хорошее решение. – jezrael

+0

Я думаю, что пришло время :) –

4

Вы можете использовать str.contains, чтобы соответствовать каждому из подстрок с помощью регулярных выражений | характера, который подразумевает наличие OR выбора из содержимого другой серии:

df[df['B'].str.contains("|".join(df['A']))] 

enter image description here

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