1、根據值在是否在列表中進行切片:
方法一:使用isin方法可以根據DataFrame中的某列的值是否在某個列表中來進行切片(注意:這裏不要直接使用in,否則會報錯),代碼如下:
pf = pd.DataFrame([['74-27-EA-4D-93-BD','act_click','click_news',3],['E0-3F-49-79-C8-97','act_biz','click_hb.seb',199],
['E0-3F-49-79-C8-97', 'msg_view', '1', 4],
['E0-3F-49-79-C8-97', 'msg_view', '2', 36],
['E0-3F-49-79-C8-97', 'msg_view', '3', 2],
['40-8D-5C-98-35-70', 'act_biz', 'click_hb.wet', 7],
['74-27-EA-4D-93-BD', 'act_biz', 'click_hb.wet', 5]],
columns=['MAC','ACT','ACT_POINT','CLICKS'])
print(pf)
lt = ['click_news','click_hb.seb','click_hb.wet']
print(pf.loc[pf['ACT_POINT'].isin(lt)])
print(pf[pf['ACT_POINT'].isin(lt)])
結果如下:
MAC ACT ACT_POINT CLICKS
0 74-27-EA-4D-93-BD act_click click_news 3
1 E0-3F-49-79-C8-97 act_biz click_hb.seb 199
5 40-8D-5C-98-35-70 act_biz click_hb.wet 7
6 74-27-EA-4D-93-BD act_biz click_hb.wet 5
MAC ACT ACT_POINT CLICKS
0 74-27-EA-4D-93-BD act_click click_news 3
1 E0-3F-49-79-C8-97 act_biz click_hb.seb 199
5 40-8D-5C-98-35-70 act_biz click_hb.wet 7
6 74-27-EA-4D-93-BD act_biz click_hb.wet 5
方法二:這裏再講一種方法使用列的str計算來返回,這種方法可以在更大廣闊的地方使用,例如可以實現類似SQL方法中的like方法。
主旨,是使用str.extract()方法來判斷,由於extract可以使用正則表達式,所以使用起來比較方便。
具體str.extract方法的講解,可以參見官方原文,講解得比較好:http://pandas.pydata.org/pandas-docs/stable/user_guide/text.html
str.extract方法主要有兩個參數:
第一個參數是正則表達式,也就需要匹配的子字符串;
第二個參數表示是否需要返回匹配的值。
首先看一下str.extract()方法的執行效果:
In:
print(pf['ACT_POINT'].str.extract('(click_news|click_hb.seb|click_hb.wet)', expand=False))
Out:
0 click_news
1 click_hb.seb
2 NaN
3 NaN
4 NaN
5 click_hb.wet
6 click_hb.wet
Name: ACT_POINT, dtype: object
從上面的實踐可以看出,只需要把非空的值取出來,主可以達到我們上面isin方法的相同的效果。所以接下來的代碼也是水到渠成了:
print(pf[pf['ACT_POINT'].str.extract('(click_news|click_hb.seb|click_hb.wet)', expand=False).notnull()])