2017-05-06 42 views
2

列I有一個這樣的數據幀:Python的熊貓過濾器的多準則

A  B  D 
d  151  M 
d  152  a 
d  153  M 
d  161  z 
d  164  M 
d  169  g 
d  178  g 
d  173  e 
d  176  j 
d  605  j 
d  603  d 
d  607  e 
d  905  j 
d  903  d 
d  907  e 

我想基於B.具體而言,我想塔B與15開始的值列的值對其進行過濾, 16和60我的數據幀將減少到:

A  B  D 
d  151  M 
d  152  a 
d  153  M 
d  161  z 
d  164  M 
d  169  g 
d  605  j 
d  603  d 
d  607  e 

到目前爲止,我沒有成功實現這一結果。這將是實現這一目標的最佳方式?

回答

2

你需要轉換爲str第一,並選擇與isin相比第一2值和濾波器boolean indexing

print (df.B.astype(str).str[:2]) 
0  15 
1  15 
2  15 
3  16 
4  16 
5  16 
6  17 
7  17 
8  17 
9  60 
10 60 
11 60 
12 90 
13 90 
14 90 
Name: B, dtype: object 

print (df[df.B.astype(str).str[:2].isin(['15','16','60'])]) 
    A B D 
0 d 151 M 
1 d 152 a 
2 d 153 M 
3 d 161 z 
4 d 164 M 
5 d 169 g 
9 d 605 j 
10 d 603 d 
11 d 607 e 

另一種解決方案是使用contains自定義的正則表達式 - ^意味着字符串和|或開始:

L = [15,16,90] 
val = '|'.join(['^' + str(x) for x in L]) 
print (val) 
^15|^16|^90 
print (df[df.B.astype(str).str.contains(val)]) 
    A B D 
0 d 151 M 
1 d 152 a 
2 d 153 M 
3 d 161 z 
4 d 164 M 
5 d 169 g 
12 d 905 j 
13 d 903 d 
14 d 907 e 
0
>>> df[df['B'].map(lambda x: str(x[:2]) in ['15', '16', '60'])] 
    A B D 
0 d 151 M 
1 d 152 a 
2 d 153 M 
3 d 161 z 
4 d 164 M 
5 d 169 g 
9 d 605 j 
10 d 603 d 
11 d 607 e 
+0

有點危險,如果B列是'None'或'NaN' - 出錯。 – jezrael

+0

@jezrael更新地址無或NaN – Hackaholic

+0

只我認爲如果在列B是'None'或'NaN'得到錯誤 - 所以解決方案只有在100%肯定不會得到它時才起作用。所以更好的是使用'str.contains'或'isin'來處理它。 – jezrael