2017-01-24 56 views
3

如何過濾哪些列包含另一列? 例如,如果我們有兩列A,B的DT,我們可以用B.contains(A)過濾行嗎?不僅僅是如果B包含來自DT的所有A的一些A值,而且僅包含一行。熊貓,過濾器行中哪列包含另一列

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

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

什麼是輸出值是否'lolec'和'pio'是換? – jezrael

+0

然後在結果中將只有第二行。 –

+0

謝謝你,看我的答案。 – jezrael

回答

1

可以使用boolean indexingapplyin形成的遮掩,如果需要過濾列AB每行:

#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