【Python】extract及contains⽅法(正则提取筛选数据)
⼀,extract⽅法的使⽤
extract函数主要是对于数据进⾏提取。场景⼀般对于DataFrame中的⼀列中的数据进⾏提取的场合⽐较多。
例如⼀列中包含了很长的字段,我们希望在这些字段中提取出我们想要的字段时,就可以通过extract⽅法进⾏数据的提取了。
好了,废话不多说直接上代码。
数据源
序号姓名服务卡卡号消费地点消费时间理赔⾦额(元)交易明细数量
1    张三    8100001    我爱花钱连锁有限公司    2020/3/1 8:0
2    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_act(R"(?P<;明细>[\u4E00-\u9FA5]+\(*[\u4E00-\u9FA5]+\)*)")
df02 = get_act(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
<_excel("./datas/extract_结果.xlsx",index=False)
print("⽂件写⼊完毕!!")
#%%
结果
⼆,contains⽅法的使⽤
contains对⽐extract⽽⾔更多的不是提取,⽽是⼀种筛选。有种想python中的in的关系。
只要查询的DataFrame的某列或者某⾏包含查询字符串的部分字段就可以匹配出所有匹配到的数据。当然可以直接传字符串也可以通过正则来进⾏筛选。数据源
学员编号学⽣姓名学⽣年龄⼿机号码    E-mail地址家庭住址
101    刘鹏    18    135********    www.zhangsan@qq    江苏省苏州市⼯业园区津梁街
102    李四    20    159********    www.lisi.163    北京市朝阳区西北路⽯井街22幢
103    赵五    17    186********    www.zhaofive.yahoo    ⼭东省烟台市芝罘区北⼤街55号
104    tony    30    158********    liu.ibm    江苏省苏州市姑苏区⼭塘街177号
105    马云    47    159********    www.mayun.alibaba    浙江省杭州市西湖路110号1888
106    Jack    20    136********    www.jack123@qq    ⼴东省深圳市南⼭区西丽1592幢12
107    tom    19    186********    456@qq    ⼭东省青岛市⼈民路1234幢
代码:这⾥通过jupyter分段来显⽰结果
#%%
import pandas as pd
import re
df = pd.read_excel("./datas/Person_info1.xlsx")
#%%
#传⼊正则匹配只要包含的数据
df.loc[df["家庭住址"].ains(r"\d")]
结果
通过字符串筛选数据
#%%
#传⼊字符串,contains属于模糊查.只要包含就筛选
df.loc[df["家庭住址"].ains(r"津梁街")]
#%%
df.loc[df["家庭住址"].ains("江苏省")]
结果
另外contains可以⼆次多次运⽤。因为涉及到保密数据不⽅便展⽰复杂数据。⼤家可以先尝试按照上⾯的简单数据,先过滤出家庭地址,再过滤出来年龄。当然也可以通过loc中的掩码来过滤。⽅法很多希望灵活应⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。