[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()])

版权声明:本文为wx0628原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。