[Pandas]Dataframe中切片常用技巧

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()])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章