码迷,mamicode.com
首页 > 编程语言 > 详细

【Python】extract及contains方法(正则提取筛选数据)

时间:2020-08-26 17:20:37      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:取数据   同仁堂   nta   比较   学生   关系   ros   join   zha   

一,extract方法的使用

extract函数主要是对于数据进行提取。场景一般对于DataFrame中的一列中的数据进行提取的场合比较多。

例如一列中包含了很长的字段,我们希望在这些字段中提取出我们想要的字段时,就可以通过extract方法进行数据的提取了。

好了,废话不多说直接上代码。

数据源

技术图片
序号    姓名    服务卡卡号    消费地点    消费时间    理赔金额(元)    交易明细    数量
1    张三    8100001    我爱花钱连锁有限公司    2020/3/1 8:02    605    珍牡肾骨胶囊(珍泉)0.63g*48粒*3盒    1
2    张三    8100001    我爱花钱连锁有限公司    2020/3/1 8:02    1225    桂龙药膏(葛洪)202g*6瓶    1
3    张三    8100001    我爱花钱连锁有限公司    2020/3/2 10:58    27    胆宁片(上药牌)0.36g*60片/瓶    1
4    李四    8100002    我爱花钱连锁有限公司    2020/3/1 9:20    30    阿莫西林胶囊0.5g*24粒/盒    3
5    李四    8100002    我爱花钱连锁有限公司    2020/3/1 9:20    5    氨咖黄敏胶囊(康麦尔)12粒/盒    1
6    李四    8100002    我爱花钱连锁有限公司    2020/3/4 14:26    51    阿归养血口服液(中联)10ml*24支/盒    1
7    李四    8100002    我爱花钱连锁有限公司    2020/3/4 14:26    5    氨咖黄敏胶囊(康麦尔)12粒/盒    1
8    李四    8100002    我爱花钱连锁有限公司    2020/3/9 17:56    28    胆宁片(上药牌)0.36g*60片/瓶    1
9    李四    8100002    我爱花钱连锁有限公司    2020/3/19 11:19    56    柴石退热颗粒(德众)8g*6袋/盒    1
10    李四    8100002    我爱花钱连锁有限公司    2020/3/21 16:04    68    醒脾胶囊0.3g*30粒    1
11    李四    8100002    我爱花钱连锁有限公司    2020/3/31 10:00    60    小败毒膏(东方博爱)10g*8袋    1
12    王五    8100003    我爱花钱连锁有限公司    2020/3/1 10:43    114    枣仁安神液10ml*7支    1
13    王五    8100003    我爱花钱连锁有限公司    2020/3/17 10:40    118    益气维血颗粒(红珊瑚)10g*15袋    1
14    王五    8100003    我爱花钱连锁有限公司    2020/3/21 8:19    615    比卡鲁胺片(双益安)50mg*14s*2板    1
15    王五    8100003    我爱花钱连锁有限公司    2020/3/1 10:56    120    消痛贴膏(奇正)1.2g:2.5ml*10贴/盒    1
16    王五    8100003    我爱花钱连锁有限公司    2020/3/1 12:56    198    复方首乌地黄丸(修正)3g*10袋*3小盒    1
17    王五    8100003    我爱花钱连锁有限公司    2020/3/1 12:56    28    胆宁片(上药牌)0.36g*60片/瓶    1
18    王五    8100003    我爱花钱连锁有限公司    2020/3/1 13:53    256    河车大造丸(同仁堂)9g*10丸/盒    1
19    赵六    8100004    我爱花钱连锁有限公司    2020/3/1 14:52    7    复方氨酚烷胺片(新迪)12片/盒    1
20    赵六    8100004    我爱花钱连锁有限公司    2020/3/1 14:52    149    法莫替丁分散片20mg*36片/盒    1
21    赵六    8100004    我爱花钱连锁有限公司    2020/3/9 19:56    100    朱砂安神丸6g*10袋    1
22    赵六    8100004    我爱花钱连锁有限公司    2020/3/9 19:56    23    清热消炎宁片0.4g*24片/盒    1
23    赵六    8100004    我爱花钱连锁有限公司    2020/3/1 15:16    30    多酶片100s/盒    1
24    赵六    8100004    我爱花钱连锁有限公司    2020/3/1 15:16    1139    补肺丸(养无极)9g*10丸*16板    1
25    赵六    8100004    我爱花钱连锁有限公司    2020/3/5 17:25    170    补肾益寿片(恒修堂)0.4g*100片    1
26    赵六    8100004    我爱花钱连锁有限公司    2020/3/5 17:25    800    益安宁丸72丸*2瓶(每18丸重3.1g)    1
27    赵六    8100004    我爱花钱连锁有限公司    2020/3/9 17:39    800    益安宁丸72丸*2瓶(每18丸重3.1g)    1
28    赵六    8100004    我爱花钱连锁有限公司    2020/3/11 17:30    480    七十味珍珠丸(甘露)1g*6s    1
29    赵六    8100004    我爱花钱连锁有限公司    2020/3/22 16:58    1154    双参龙胶囊45盒装0.3g*24s*45盒    1
30    杨七    8100005    我爱花钱连锁有限公司    2020/3/1 16:54    100    朱砂安神丸6g*10袋    1
31    杨七    8100005    我爱花钱连锁有限公司    2020/3/12 20:53    14    消痔灵片0.3g*24片    1
32    杨七    8100005    我爱花钱连锁有限公司    2020/3/18 10:04    402    回元堂 固本回元口服液 20ml*24瓶20ml*24瓶    1
33    杨七    8100005    我爱花钱连锁有限公司    2020/3/21 11:18    847    伏立康唑分散片(复锐)0.2g*6s    1
34    杨七    8100005    我爱花钱连锁有限公司    2020/3/1 17:36    30    多酶片100s/盒    1
View Code

代码

这里是通过jupyter来分段显示的。第一次看我文章的小伙伴如果不了解jupyter可以在复制下面代码的时候把所有输出改成通过print()的方式输出

#%%

import pandas as pd
import re

#需求: 
# 1. 把交易明细分成明细跟规格两列并删除交易明细这列
# 2. 明细中把例如珍牡肾骨胶囊(珍泉)的作为明细,0.63g*48粒*3盒作为规格拆分提取

#读取源数据
df = pd.read_excel("./datas/extract案例演示数据.xlsx")

#%%
#提取交易明细这一列
get_column = df["交易明细"]

#通过正则提取数据(?P<名字>)为固定写法给数据加新列名
df01 = get_column.str.extract(R"(?P<明细>[\u4E00-\u9FA5]+\(*[\u4E00-\u9FA5]+\)*)")
df02 = get_column.str.extract(R"(?P<规格>(?:0.|\w*)\w*\*\w*[\u4e00-\u9fa5](?:\S+|))")

#%%
#通过join函数合并2个DataFrame
join_data = df01.join(df02)
join_data
#%%
#删除原有交易明细数据
del df["交易明细"]
df
#%%
#二次合并,删除后交易明细的dataframe合并拆分后数据的dataframe
two_join = df.join(join_data)
#%%
#因为合并后存在排序问题,列名为汉字所以我通过loc方法进行的列名指定排序
#loc方法这里不再讲解,请参照loc,iloc篇章

result = two_join.loc[:,["序号","姓名","消费地点","消费时间",
          "理赔金额(元)","明细","规格","数量"]]
result

#%%
#输出到Excel
result.to_excel("./datas/extract_结果.xlsx",index=False)
print("文件写入完毕!!")
#%%

结果

技术图片

二,contains方法的使用
contains对比extract而言更多的不是提取,而是一种筛选。有种想python中的in的关系。

只要查询的DataFrame的某列或者某行包含查询字符串的部分字段就可以匹配出所有匹配到的数据。当然可以直接传字符串也可以通过正则来进行筛选。

数据源

学员编号    学生姓名    学生年龄    手机号码    E-mail地址    家庭住址
101    刘鹏    18    13599713364    www.zhangsan@qq.com    江苏省苏州市工业园区津梁街
102    李四    20    15923796671    www.lisi.163.com    北京市朝阳区西北路石井街22幢
103    赵五    17    18655301183    www.zhaofive.yahoo.com    山东省烟台市芝罘区北大街55号
104    tony    30    15877563321    www.tonyliu.ibm.com    江苏省苏州市姑苏区山塘街177号
105    马云    47    15977560013    www.mayun.alibaba.com    浙江省杭州市西湖路110号1888
106    Jack    20    13677569901    www.jack123@qq.com    广东省深圳市南山区西丽1592幢12
107    tom    19    18622349971    www.tom456@qq.com    山东省青岛市人民路1234幢

代码:这里通过jupyter分段来显示结果

#%%

import pandas as pd
import re

df = pd.read_excel("./datas/Person_info1.xlsx")

#%%

#传入正则匹配只要包含的数据

df.loc[df["家庭住址"].str.contains(r"\d")]

结果

技术图片

通过字符串筛选数据

#%%

#传入字符串,contains属于模糊查找.只要包含就筛选
df.loc[df["家庭住址"].str.contains(r"津梁街")]

#%%

df.loc[df["家庭住址"].str.contains("江苏省")]

结果

技术图片

另外contains可以二次多次运用。因为涉及到保密数据不方便展示复杂数据。大家可以先尝试按照上面的简单数据,先过滤出家庭地址,再过滤出来年龄。

当然也可以通过loc中的掩码来过滤。方法很多希望灵活应用。

 

【Python】extract及contains方法(正则提取筛选数据)

标签:取数据   同仁堂   nta   比较   学生   关系   ros   join   zha   

原文地址:https://www.cnblogs.com/liupengpengg/p/13534757.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!