halcon 将数据保存到excel_pandas筛选、合并、批量保存excel数据
人生苦短,我學(xué)python!
python是目前最流行的編程語言,功能十分強(qiáng)大,在爬蟲、數(shù)據(jù)分析、人工智能方面均得以廣泛應(yīng)用。本專輯主要分享兩個數(shù)據(jù)分析庫numpy和pandas在數(shù)據(jù)分析方面的基礎(chǔ)知識和各種技能,pandas的快、準(zhǔn)、簡潔遠(yuǎn)非office的excel可比,而且免費(fèi)。本期開始將全面總結(jié)pandas在處理excel數(shù)據(jù)的方方面面的知識,力爭通過100期左右,完成pandas和numpy相關(guān)知識的介紹及其配套數(shù)據(jù)可視化庫matplotlib和seaborn的介紹。特別說明,做這個專輯,純屬愛好,總結(jié)所學(xué)知識。pandas的強(qiáng)大,誰用誰知道,絕非打廣告。我把她叫做超級excel。由于是筆記,當(dāng)然就是先從非常厲害的東東開始了,所以沒有依據(jù)由淺入深的順序。知識的記錄仍然按照知識點(diǎn)的方式進(jìn)行,所有代碼均經(jīng)過反復(fù)實(shí)踐,力爭知識點(diǎn)沒有錯誤。操作平臺有Jupyter Notebook 、pycharm。安裝非常簡單。后期估計會記錄一些他們的設(shè)置。本期共6547個字,需要花費(fèi)17分鐘閱讀。本期是第一期,如果沒人喜歡,下期開始就設(shè)置權(quán)限了,本來就是自己的學(xué)習(xí)小結(jié),錯誤在所難免,對您有用就看看,沒用就繞道,謝謝!建議電腦查看,手機(jī)查看格式可能會亂。
知識點(diǎn)一:批量打開多工作薄并快速進(jìn)行合并具體步驟:
環(huán)境準(zhǔn)備:
import pandas as pd
import os
第一步,新建文件夾(里需要合并的多個工作表)定義新建文件夾的路徑;
imputdir = r'C:\Users\xiaobin\Desktop\111'
第一步,新建一個空的DateFrame;
dfe=pd.DataFrame(columns=['姓名','2011年','2012年','2013年','2014年'])
第三步:利用os庫中的walk方法可以遍歷文件夾的所有文件,并讀取文件的名字,os.path.join能夠?qū)⑽募A的路徑和文件夾中的名字合并成每個文件完整路徑。并將每個文件讀取,再與空的DateFrame合并.
for parents,dirnames,filenames in os.walk(imputdir):
? ? for filename in filenames:
? ? ? ? df=pd.read_excel(os.path.join(parents,filename))
? ? ? ? dfe=dfe.append(df,ignore_index=True)
第四歩:保存數(shù)據(jù)
df_empty.to_excel(r'C:\Users\xiaobin\Desktop\111\匯總表.xlsx',index_label='序號')
完整代碼如下:
import pandas as pd
import os
imputdir = r'C:\Users\xiaobin\Desktop\111'
dfe=pd.DataFrame(columns=['姓名','2011年','2012年','2013年','2014年'])
for parents,dirnames,filenames in os.walk(imputdir):
? ? for filename in filenames:
? ? ? ? df=pd.read_excel(os.path.join(parents,filename))
? ? ? ? dfe=dfe.append(df,ignore_index=True)
df_empty.to_excel(r'C:\Users\xiaobin\Desktop\111\匯總表.xlsx',index_label='序號')
知識點(diǎn)二:保存多個工作表到同一工作薄環(huán)境安裝:
import numpy as np
import pandas as pd
path='要保存的路徑'
with pd.ExcelWriter(path) as writer:
? ? df.to_excel(writer,sheet_name='第一個文件的名字',columns=['需要保存的列名,用逗號隔開'],index=True,index_label='行索引的名字')
? ? df.to_excel(writer,sheet_name='第二個文件的名字',columns=['需要保存的列名,用逗號隔開'],index=True,index_label='行索引的名字')
? ? df.to_excel(writer,sheet_name='第一個文件的名字',columns=['需要保存的列名,用逗號隔開'],index=True,index_label='行索引的名字')??
非常簡單,就不贅述了。
知識點(diǎn)三:神器篩選直接上我操練的代碼吧。篩選方法第一種:通過索引篩選 filter函數(shù)In?[1]:
import numpy as npimport pandas as pdIn?[139]:
path=r'C:\Users\xiaobin\Desktop\練習(xí).xlsx'df=pd.read_excel(path,index_col=0)dfOut[139]:
| 82 | 103 | 61 | 58 | 96 | 康定 |
| 144 | 148 | 85 | 62 | 60 | 烏魯木齊 |
| 121 | 73 | 142 | 56 | 145 | 常州 |
| 139 | 119 | 120 | 86 | 94 | 石家莊 |
| 93 | 107 | 55 | 83 | 138 | 唐山 |
| 145 | 111 | 65 | 126 | 66 | 連云港 |
| 130 | 123 | 116 | 132 | 110 | 蘇州 |
| AA | A | B | AB | BB | NaN |
對序列進(jìn)行篩選,針對Series的序列
In?[140]:
df.西瓜.filter(items=['李四','李山'])Out[140]:
李四 144李山 139
Name: 西瓜, dtype: object
In?[141]:
df.西瓜.filter(like=('李'))Out[141]:
李四 144李山 139
小李子 93
Name: 西瓜, dtype: object
In?[142]:
df.西瓜.filter(regex=('^李.$'))Out[142]:
李四 144李山 139
Name: 西瓜, dtype: object
針對DateFrame的index(行索引)columns(列索引)
In?[143]:
df.filter(items=['李四','李山'],axis=0) #行索引篩選axis=0,如果axis=1針對列篩選Out[143]:
| 144 | 148 | 85 | 62 | 60 | 烏魯木齊 |
| 139 | 119 | 120 | 86 | 94 | 石家莊 |
In?[144]:
df.filter(items=['李四','李山'],axis=1) #如果設(shè)置axis=1,啥都沒有Out[144]:
In?[145]:
df.filter(items=['西瓜','苦瓜'],axis=1) #對列索引進(jìn)行篩選Out[145]:
| 82 | 61 |
| 144 | 85 |
| 121 | 142 |
| 139 | 120 |
| 93 | 55 |
| 145 | 65 |
| 130 | 116 |
| AA | B |
In?[146]:
df.filter(items=['西瓜','苦瓜'],axis='columns')?
#對列篩選columns
Out[146]:
| 82 | 61 |
| 144 | 85 |
| 121 | 142 |
| 139 | 120 |
| 93 | 55 |
| 145 | 65 |
| 130 | 116 |
| AA | B |
In?[147]:
df.filter(items=['李四','李山'],axis='index') #行索引篩選axis='index',如果axis=1針對列篩選Out[147]:
| 144 | 148 | 85 | 62 | 60 | 烏魯木齊 |
| 139 | 119 | 120 | 86 | 94 | 石家莊 |
In?[148]:
df.filter(like='李',axis='index')Out[148]:
| 144 | 148 | 85 | 62 | 60 | 烏魯木齊 |
| 139 | 119 | 120 | 86 | 94 | 石家莊 |
| 93 | 107 | 55 | 83 | 138 | 唐山 |
In?[149]:
df.filter(like='瓜',axis='columns')
Out[149]:
| 82 | 61 | 58 |
| 144 | 85 | 62 |
| 121 | 142 | 56 |
| 139 | 120 | 86 |
| 93 | 55 | 83 |
| 145 | 65 | 126 |
| 130 | 116 | 132 |
| AA | B | AB |
In?[150]:
df.filter(regex='瓜',axis='columns')
Out[150]:
| 82 | 61 | 58 |
| 144 | 85 | 62 |
| 121 | 142 | 56 |
| 139 | 120 | 86 |
| 93 | 55 | 83 |
| 145 | 65 | 126 |
| 130 | 116 | 132 |
| AA | B | AB |
In?[151]:
df.filter(regex='^..$',axis='columns')Out[151]:
| 82 | 61 | 58 | 康定 |
| 144 | 85 | 62 | 烏魯木齊 |
| 121 | 142 | 56 | 常州 |
| 139 | 120 | 86 | 石家莊 |
| 93 | 55 | 83 | 唐山 |
| 145 | 65 | 126 | 連云港 |
| 130 | 116 | 132 | 蘇州 |
| AA | B | AB | NaN |
In?[152]:
df.filter(regex='^..$',axis='index')Out[152]:
| 82 | 103 | 61 | 58 | 96 | 康定 |
| 144 | 148 | 85 | 62 | 60 | 烏魯木齊 |
| 139 | 119 | 120 | 86 | 94 | 石家莊 |
| 130 | 123 | 116 | 132 | 110 | 蘇州 |
| AA | A | B | AB | BB | NaN |
In?[153]:
前面是針對Series和DateFrame的索引進(jìn)行篩選,下面針對DateFrame的數(shù)據(jù)行和列進(jìn)行篩選原理是針對序列Series的str.match方法 File "", line 1 前面是針對Series和DateFrame的索引進(jìn)行篩選,下面針對DateFrame的數(shù)據(jù)行和列進(jìn)行篩選In?[154]:
對 DataFrame 行或列進(jìn)行篩選print('-----對 DataFrame 的正則篩選-------')print(df[df.地區(qū).astype(str).str.match('^..$')])#對 df 的行篩選print(df.T[df.T.級別.astype(str).str.match('[AB]{2}')].T)#對 df 的列篩選In?[155]:#篩選滿足條件的某些列df.地區(qū).str.match('^..$',na=False) #含義是篩選出地區(qū)中只有兩個字的地區(qū)的對應(yīng)行內(nèi)容。Out[155]:
張三 True李四 False
王二麻子 True
李山 False
小李子 True
曾賢志 False
黃山 True
級別 False
Name: 地區(qū), dtype: bool
In?[156]:
df[df.地區(qū).str.match('^..$')] #此處出現(xiàn)錯誤主要是篩選字段地區(qū)中有錯誤值或者空值如何處理看下面,參數(shù)na=False就是屏蔽掉錯誤值。--------------------------------------------------------------------------ValueError Traceback (most recent call last) in ----> 1 df[df.地區(qū).str.match('^..$')] #此處出現(xiàn)錯誤主要是篩選字段地區(qū)中有錯誤值或者空值如何處理看下面,參數(shù)na=False就是屏蔽調(diào)錯誤值d:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key) 2789 # Do we have a (boolean) 1d indexer?-> 2790 if com.is_bool_indexer(key): 2791 return self._getitem_bool_array(key) 2792 d:\ProgramData\Anaconda3\lib\site-packages\pandas\core\common.py in is_bool_indexer(key) 134 na_msg = "Cannot mask with non-boolean array containing NA / NaN values" 135 if isna(key).any():--> 136 raise ValueError(na_msg) 137 return False 138 return TrueValueError: Cannot mask with non-boolean array containing NA / NaN valuesIn?[157]:
df[df.地區(qū).str.match('^..$',na=False)] #看吧,正確了,不過還有其他方法處理錯誤值或者缺失值Out[157]:
| 82 | 103 | 61 | 58 | 96 | 康定 |
| 121 | 73 | 142 | 56 | 145 | 常州 |
| 93 | 107 | 55 | 83 | 138 | 唐山 |
| 130 | 123 | 116 | 132 | 110 | 蘇州 |
In?[158]:
df.地區(qū).astype(str).str.match('^..$')#兩者對比看一下,空值轉(zhuǎn)為字符串就變成false,放入索引中就不會被選擇。Out[158]:
張三 True李四 False
王二麻子 True
李山 False
小李子 True
曾賢志 False
黃山 True
級別 False
Name: 地區(qū), dtype: bool
In?[159]:
df.地區(qū).str.match('^..$')Out[159]:
張三 True李四 False
王二麻子 True
李山 False
小李子 True
曾賢志 False
黃山 True
級別 NaN
Name: 地區(qū), dtype: object
上面是對列字段的處理,針對行字段的處理首先要把表格轉(zhuǎn)置.T,
看一下數(shù)據(jù),此次利用級別行來篩選
In?[160]:
dfOut[160]:
| 82 | 103 | 61 | 58 | 96 | 康定 |
| 144 | 148 | 85 | 62 | 60 | 烏魯木齊 |
| 121 | 73 | 142 | 56 | 145 | 常州 |
| 139 | 119 | 120 | 86 | 94 | 石家莊 |
| 93 | 107 | 55 | 83 | 138 | 唐山 |
| 145 | 111 | 65 | 126 | 66 | 連云港 |
| 130 | 123 | 116 | 132 | 110 | 蘇州 |
| AA | A | B | AB | BB | NaN |
In?[161]:
df.T #第一步,表格轉(zhuǎn)置Out[161]:
| 82 | 144 | 121 | 139 | 93 | 145 | 130 | AA |
| 103 | 148 | 73 | 119 | 107 | 111 | 123 | A |
| 61 | 85 | 142 | 120 | 55 | 65 | 116 | B |
| 58 | 62 | 56 | 86 | 83 | 126 | 132 | AB |
| 96 | 60 | 145 | 94 | 138 | 66 | 110 | BB |
| 康定 | 烏魯木齊 | 常州 | 石家莊 | 唐山 | 連云港 | 蘇州 | NaN |
In?[162]:
df.values #df數(shù)據(jù)內(nèi)容時ndarray,二維數(shù)組Out[162]:
array([[82, 103, 61, 58, 96, '康定'],[144, 148, 85, 62, 60, '烏魯木齊'],
[121, 73, 142, 56, 145, '常州'],
[139, 119, 120, 86, 94, '石家莊'],
[93, 107, 55, 83, 138, '唐山'],
[145, 111, 65, 126, 66, '連云港'],
[130, 123, 116, 132, 110, '蘇州'],
['AA', 'A', 'B', 'AB', 'BB', nan]], dtype=object)
In?[163]:
df.T[df.T.級別.str.match('[AB]{2}',na=False)] #任務(wù)完成不過與原表不一致,咋整呢?Out[163]:
| 82 | 144 | 121 | 139 | 93 | 145 | 130 | AA |
| 58 | 62 | 56 | 86 | 83 | 126 | 132 | AB |
| 96 | 60 | 145 | 94 | 138 | 66 | 110 | BB |
In?[164]:
df.T[df.T.級別.str.match('[AB]{2}',na=False)].T #再次進(jìn)行轉(zhuǎn)置Out[164]:
| 82 | 58 | 96 |
| 144 | 62 | 60 |
| 121 | 56 | 145 |
| 139 | 86 | 94 |
| 93 | 83 | 138 |
| 145 | 126 | 66 |
| 130 | 132 | 110 |
| AA | AB | BB |
總結(jié)
以上是生活随笔為你收集整理的halcon 将数据保存到excel_pandas筛选、合并、批量保存excel数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html异形轮播,异形滚动
- 下一篇: mac怎么合并两个容器_Mac怎么合并文