1. 程式人生 > 程式設計 >Python extract及contains方法程式碼例項

Python extract及contains方法程式碼例項

一,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

程式碼

這裡是通過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("檔案寫入完畢!!")
#%%

結果

Python extract及contains方法程式碼例項

二,contains方法的使用

contains對比extract而言更多的不是提取,而是一種篩選。有種想python中的in的關係。

只要查詢的DataFrame的某列或者某行包含查詢字串的部分欄位就可以匹配出所有匹配到的資料。當然可以直接傳字串也可以通過正則來進行篩選。

資料來源

學員編號  學生姓名  學生年齡  手機號碼  E-mail地址  家庭住址
101  劉鵬  18  13599713364  [email protected]  江蘇省蘇州市工業園區津樑街
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  [email protected]  廣東省深圳市南山區西麗1592幢12
107  tom  19  18622349971  [email protected]  山東省青島市人民路1234幢

程式碼:這裡通過jupyter分段來顯示結果

#%%
import pandas as pd
import re
df = pd.read_excel("./datas/Person_info1.xlsx")
#%%
#傳入正則匹配只要包含的資料
df.loc[df["家庭住址"].str.contains(r"\d")]

結果

Python extract及contains方法程式碼例項

通過字串篩選資料

#%%
#傳入字串,contains屬於模糊查詢.只要包含就篩選
df.loc[df["家庭住址"].str.contains(r"津樑街")]
#%%
df.loc[df["家庭住址"].str.contains("江蘇省")]

結果

Python extract及contains方法程式碼例項

另外contains可以二次多次運用。因為涉及到保密資料不方便展示覆雜資料。大家可以先嚐試按照上面的簡單資料,先過濾出家庭地址,再過濾出來年齡。

當然也可以通過loc中的掩碼來過濾。方法很多希望靈活應用。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。