<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用 Python 實現(xiàn) Excel 辦公常用操作!

          共 9700字,需瀏覽 20分鐘

           ·

          2022-11-24 16:33

          本文用的主要是pandas,繪圖用的庫是plotly,實現(xiàn)的Excel的常用功能有:

          • Python和Excel的交互
          • vlookup函數(shù)
          • 數(shù)據(jù)透視表
          • 繪圖

          以后如果發(fā)掘了更多Excel的功能,會回來繼續(xù)更新和補充。開始之前,首先按照慣例加載pandas包:

                import?numpy?as?np
          import?pandas?as?pd
          pd.set_option('max_columns',?10)
          pd.set_option('max_rows',?20)
          pd.set_option('display.float_format',?lambda?x:?'%.2f'?%?x)?#?禁用科學計數(shù)法

          Python和Excel的交互

          pandas里最常用的和Excel I/O有關(guān)的四個函數(shù)是read_csv/ read_excel/ to_csv/ to_excel,它們都有特定的參數(shù)設(shè)置,可以定制想要的讀取和導出效果。比如說想要讀取這樣一張表的左上部分:

          f422f4512243f0abf4df16f60ce03b96.webp

          可以用pd.read_excel("test.xlsx", header=1, nrows=17, usecols=3),返回結(jié)果:

                df
                       工號   姓名 性別  部門
          0 A0001 張偉 男 工程
          1 A0002 王秀英 女 人事
          2 A0003 王芳 女 行政
          3 A0004 鄭勇 男 市場
          4 A0005 張麗 女 研發(fā)
          5 A0006 王艷 女 后勤
          6 A0007 李勇 男 市場
          7 A0008 李娟 女 工程
          8 A0009 張靜 女 人事
          9 A0010 王磊 男 行政
          10 A0011 李娜 女 市場
          11 A0012 劉詩雯 女 研發(fā)
          12 A0013 王剛 男 后勤
          13 A0014 葉倩 女 后勤
          14 A0015 金雯雯 女 市場
          15 A0016 王超杰 男 工程
          16 A0017 李軍 男 人事

          輸出函數(shù)也同理,使用多少列,要不要index,標題怎么放,都可以控制。

          vlookup函數(shù)

          vlookup號稱是Excel里的神器之一,用途很廣泛,下面的例子來自豆瓣,VLOOKUP函數(shù)最常用的10種用法,你會幾種?[2]

          案例一

          問題:A3:B7單元格區(qū)域為字母等級查詢表,表示60分以下為E級、60~69分為D級、70~79分為C級、80~89分為B級、90分以上為A級。D:G列為初二年級1班語文測驗成績表,如何根據(jù)語文成績返回其字母等級?

          6f3423a5f44691c2db23986990b4ecaa.webp

          方法:在H3:H13單元格區(qū)域中輸入=VLOOKUP(G3, $A$3:$B$7, 2)

          python實現(xiàn):

                df?=?pd.read_excel("test.xlsx",?sheet_name=0)
          def?grade_to_point(x):
          ????if?x?>=?90:
          ????????return?'A'
          ????elif?x?>=?80:
          ????????return?'B'
          ????elif?x?>=?70:
          ????????return?'C'
          ????elif?x?>=?60:
          ????????return?'D'
          ????else:
          ????????return?'E'

          df['等級']?=?df['語文'].apply(grade_to_point)
          df
                    學號   姓名 性別   語文 等級
          0 101 王小麗 女 69 D
          1 102 王寶勤 男 85 B
          2 103 楊玉萍 女 49 E
          3 104 田東會 女 90 A
          4 105 陳雪蛟 女 73 C
          5 106 楊建豐 男 42 E
          6 107 黎梅佳 女 79 C
          7 108 張興 男 91 A
          8 109 馬進春 女 48 E
          9 110 魏改娟 女 100 A
          10 111 王冰研 女 64 D

          案例二

          問題:在Sheet1里面如何查找折舊明細表中對應(yīng)編號下的月折舊額?(跨表查詢)

          4bf6ed750766d2ee2c609c8ce36d2e17.webp3eaee2de30a8eeb631ec3037bb312bed.webp

          方法:在Sheet1里面的C2:C4單元格輸入?=VLOOKUP(A2, 折舊明細表!A$2:$G$12, 7, 0)

          python實現(xiàn):使用merge將兩個表按照編號連接起來就行

                df1?=?pd.read_excel("test.xlsx",?sheet_name='折舊明細表')
          df2?=?pd.read_excel("test.xlsx",?sheet_name=1)?#題目里的sheet1
          df2.merge(df1[['編號',?'月折舊額']],?how='left',?on='編號')
                      編號   資產(chǎn)名稱  月折舊額
          0 YT001 電動門 1399
          1 YT005 桑塔納轎車 1147
          2 YT008 打印機 51

          案例三

          問題:類似于案例二,但此時需要使用近似查找

          de8a846828839c41b3a33d0b57eb2623.webpfc9127c1cdca9f6eef53dbbe4997fade.webp

          方法:在B2:B7區(qū)域中輸入公式=VLOOKUP(A2&"*", 折舊明細表!$B$2:$G$12, 6, 0)

          python實現(xiàn):這個比起上一個要麻煩一些,需要用到一些pandas的使用技巧

                df1?=?pd.read_excel("test.xlsx",?sheet_name='折舊明細表')?
          df3?=?pd.read_excel("test.xlsx",?sheet_name=3)?#含有資產(chǎn)名稱簡寫的表
          df3['月折舊額']?=?0
          for?i?in?range(len(df3['資產(chǎn)名稱'])):
          ????df3['月折舊額'][i]?=?df1[df1['資產(chǎn)名稱'].map(lambda?x:df3['資產(chǎn)名稱'][i]?in?x)]['月折舊額']

          df3
                  資產(chǎn)名稱   月折舊額
          0 電動 1399
          1 貨車 2438
          2 惠普 132
          3 交聯(lián) 10133
          4 桑塔納 1147
          5 春蘭 230

          案例四

          問題:在Excel中錄入數(shù)據(jù)信息時,為了提高工作效率,用戶希望通過輸入數(shù)據(jù)的關(guān)鍵字后,自動顯示該記錄的其余信息,例如,輸入員工工號自動顯示該員工的信命,輸入物料號就能自動顯示該物料的品名、單價等。如圖所示為某單位所有員工基本信息的數(shù)據(jù)源表,在“2010年3月員工請假統(tǒng)計表”工作表中,當在A列輸入員工工號時,如何實現(xiàn)對應(yīng)員工的姓名、身份證號、部門、職務(wù)、入職日期等信息的自動錄入?

          36c5f8833cb408df396b70bf3396f6b1.webpcee5b04a33c0a732340e9ce0091f0eb4.webp

          方法:使用VLOOKUP+MATCH函數(shù),在“2010年3月員工請假統(tǒng)計表”工作表中選擇B3:F8單元格區(qū)域,輸入下列公式=IF($A3="","",VLOOKUP($A3,員工基本信息!$A:$H,MATCH(B$2,員工基本信息!$2:$2,0),0)),按下【Ctrl+Enter】組合鍵結(jié)束。

          python實現(xiàn):上面的Excel的方法用得很靈活,但是pandas的想法和操作更簡單方便些。

                df4?=?pd.read_excel("test.xlsx",?sheet_name='員工基本信息表')
          df5?=?pd.read_excel("test.xlsx",?sheet_name='請假統(tǒng)計表')
          df5.merge(df4[['工號',?'姓名',?'部門',?'職務(wù)',?'入職日期']],?on='工號')
                      工號   姓名  部門   職務(wù)       入職日期
          0 A0004 龔夢娟 后勤 主管 2006-11-20
          1 A0003 趙敏 行政 文員 2007-02-16
          2 A0005 黃凌 研發(fā) 工程師 2009-01-14
          3 A0007 王維 人事 經(jīng)理 2006-07-24
          4 A0016 張君寶 市場 工程師 2007-08-14
          5 A0017 秦羽 人事 副經(jīng)理 2008-03-06

          案例五

          問題:用VLOOKUP函數(shù)實現(xiàn)批量查找,VLOOKUP函數(shù)一般情況下只能查找一個,那么多項應(yīng)該怎么查找呢?如下圖,如何把張一的消費額全部列出?

          be3d50b5582f5bca3bf8fa3eed02cb43.webp

          方法:在C9:C11單元格里面輸入公式=VLOOKUP(B$9&ROW(A1),IF({1,0},$B$2:$B$6&COUNTIF(INDIRECT("b2:b"&ROW($2:$6)),B$9),$C$2:$C$6),2,),按SHIFT+CTRL+ENTER鍵結(jié)束。

          python實現(xiàn):vlookup函數(shù)有兩個不足(或者算是特點吧),一個是被查找的值一定要在區(qū)域里的第一列,另一個是只能查找一個值,剩余的即便能匹配也不去查找了,這兩點都能通過靈活應(yīng)用if和indirect函數(shù)來解決,不過pandas能做得更直白一些

                df6?=?pd.read_excel("test.xlsx",?sheet_name='消費額')
          df6[df6['姓名']?==?'張一'][['姓名',?'消費額']]
                   姓名   消費額
          0 張一 100
          2 張一 300
          4 張一 1000

          數(shù)據(jù)透視表

          數(shù)據(jù)透視表是Excel的另一個神器,本質(zhì)上是一系列的表格重組整合的過程。這里用的案例來自知乎,Excel數(shù)據(jù)透視表有什么用途?[3]

          問題:需要匯總各個區(qū)域,每個月的銷售額與成本總計,并同時算出利潤

          0856af097b830ab87858f955e349342c.webp

          通過Excel的數(shù)據(jù)透視表的操作最終實現(xiàn)了下面這樣的效果:

          3a07d5bd3eac0f97e27f63be89d4b76a.webp

          python實現(xiàn):對于這樣的分組的任務(wù),首先想到的就是pandas的groupby,代碼寫起來也簡單,思路就是把剛才Excel的點鼠標的操作反映到代碼命令上:

                df?=?pd.read_excel('test.xlsx',?sheet_name='銷售統(tǒng)計表')
          df['訂購月份']?=?df['訂購日期'].apply(lambda?x:x.month)
          df2?=?df.groupby(['訂購月份',?'所屬區(qū)域'])[['銷售額',?'成本']].agg('sum')
          df2['利潤']?=?df2['銷售額']?-?df2['成本']
          df2

                                 銷售額         成本        利潤
          訂購月份 所屬區(qū)域
          1 南京 134313.61 94967.84 39345.77
          常熟 177531.47 163220.07 14311.40
          無錫 316418.09 231822.28 84595.81
          昆山 159183.35 145403.32 13780.03
          蘇州 287253.99 238812.03 48441.96
          2 南京 187129.13 138530.42 48598.71
          常熟 154442.74 126834.37 27608.37
          無錫 464012.20 376134.98 87877.22
          昆山 102324.46 86244.52 16079.94
          蘇州 105940.34 91419.54 14520.80
          ... ... ...
          11 南京 286329.88 221687.11 64642.77
          常熟 2118503.54 1840868.53 277635.01
          無錫 633915.41 536866.77 97048.64
          昆山 351023.24 342420.18 8603.06
          蘇州 1269351.39 1144809.83 124541.56
          12 南京 894522.06 808959.32 85562.74
          常熟 324454.49 262918.81 61535.68
          無錫 1040127.19 856816.72 183310.48
          昆山 1096212.75 951652.87 144559.87
          蘇州 347939.30 302154.25 45785.05

          [60 rows x 3 columns]

          也可以使用pandas里的pivot_table函數(shù)來實現(xiàn):

                df3?=?pd.pivot_table(df,?values=['銷售額',?'成本'],?index=['訂購月份',?'所屬區(qū)域']?,?aggfunc='sum')
          df3['利潤']?=?df3['銷售額']?-?df3['成本']
          df3?

                                  成本        銷售額        利潤
          訂購月份 所屬區(qū)域
          1 南京 94967.84 134313.61 39345.77
          常熟 163220.07 177531.47 14311.40
          無錫 231822.28 316418.09 84595.81
          昆山 145403.32 159183.35 13780.03
          蘇州 238812.03 287253.99 48441.96
          2 南京 138530.42 187129.13 48598.71
          常熟 126834.37 154442.74 27608.37
          無錫 376134.98 464012.20 87877.22
          昆山 86244.52 102324.46 16079.94
          蘇州 91419.54 105940.34 14520.80
          ... ... ...
          11 南京 221687.11 286329.88 64642.77
          常熟 1840868.53 2118503.54 277635.01
          無錫 536866.77 633915.41 97048.64
          昆山 342420.18 351023.24 8603.06
          蘇州 1144809.83 1269351.39 124541.56
          12 南京 808959.32 894522.06 85562.74
          常熟 262918.81 324454.49 61535.68
          無錫 856816.72 1040127.19 183310.48
          昆山 951652.87 1096212.75 144559.87
          蘇州 302154.25 347939.30 45785.05

          [60 rows x 3 columns]

          pandas的pivot_table的參數(shù)index/ columns/ values和Excel里的參數(shù)是對應(yīng)上的(當然,我這話說了等于沒說,數(shù)據(jù)透視表里不就是行/列/值嗎還能有啥。。)

          872e9ea3c5125c1e11005de41b4b28e9.webp

          但是我個人還是更喜歡用groupby,因為它運算速度非常快。我在打kaggle比賽的時候,有一張表是貸款人的行為信息,大概有2700萬行,用groupby算了幾個聚合函數(shù),幾秒鐘就完成了。

          groupby的功能很全面,內(nèi)置了很多aggregate函數(shù),能夠滿足大部分的基本需求,如果你需要一些其他的函數(shù),可以搭配使用apply和lambda。不過pandas的官方文檔說了,groupby之后用apply速度非常慢,aggregate內(nèi)部做過優(yōu)化,所以很快,apply是沒有優(yōu)化的,所以建議有問題先想想別的方法,實在不行的時候再用apply。我打比賽的時候,為了生成一個新變量,用了groupby的apply,寫了這么一句:ins['weight'] = ins[['SK_ID_PREV', 'DAYS_ENTRY_PAYMENT']].groupby('SK_ID_PREV').apply(lambda x: 1-abs(x)/x.sum().abs()).iloc[:,1],1000萬行的數(shù)據(jù),足足算了十多分鐘,等得我心力交瘁。

          繪圖

          因為Excel畫出來的圖能夠交互,能夠在圖上進行一些簡單操作,所以這里用的python的可視化庫是plotly,案例就用我這個學期發(fā)展經(jīng)濟學課上的作業(yè)吧,當時的圖都是用Excel畫的,現(xiàn)在用python再畫一遍。開始之前,首先加載plotly包。

                import?plotly.offline?as?off
          import?plotly.graph_objs?as?go
          off.init_notebook_mode()

          柱狀圖

          當時用Excel畫了很多的柱狀圖,其中的一幅圖是

          cdf569ebad39e975ffc35ac16fa0afba.webp

          下面用plotly來畫一下

          fe69e15a0e2d8a55de3fb0b81d15f62d.webp
                df?=?pd.read_excel("plot.xlsx",?sheet_name='高等教育入學率')
          trace1?=?go.Bar(
          ????????x=df['國家'],
          ????????y=df[1995],
          ????????name='1995',
          ????????opacity=0.6,
          ????????marker=dict(
          ????????????????color='powderblue'
          ????????????????)
          ????????)

          trace2?=?go.Bar(
          ????????x=df['國家'],
          ????????y=df[2005],
          ????????name='2005',
          ????????opacity=0.6,
          ????????marker=dict(
          ????????????????color='aliceblue',
          ????????????????)
          ????????)

          trace3?=?go.Bar(
          ????????x=df['國家'],
          ????????y=df[2014],
          ????????name='2014',
          ????????opacity=0.6,
          ????????marker=dict(
          ????????????????color='royalblue'
          ????????????????)
          ????????)

          layout?=?go.Layout(barmode='group')
          data?=?[trace1,?trace2,?trace3]
          fig?=?go.Figure(data,?layout)
          off.plot(fig)

          雷達圖

          用Excel畫的:

          0dd157f1e32f8681f9421588ab178b12.webp

          用python畫的:

          2b01b45e92fb91bc4f56bc4bf3819624.webp
                df?=?pd.read_excel('plot.xlsx',?sheet_name='政治治理')
          theta?=?df.columns.tolist()
          theta.append(theta[0])
          names?=?df.index
          df['']?=?df.iloc[:,0]
          df?=?np.array(df)

          trace1?=?go.Scatterpolar(
          ????????r=df[0],
          ????????theta=theta,
          ????????name=names[0]
          ????????)

          trace2?=?go.Scatterpolar(
          ????????r=df[1],
          ????????theta=theta,
          ????????name=names[1]
          ????????)

          trace3?=?go.Scatterpolar(
          ????????r=df[2],
          ????????theta=theta,
          ????????name=names[2]
          ????????)

          trace4?=?go.Scatterpolar(
          ????????r=df[3],
          ????????theta=theta,
          ????????name=names[3]
          ????????)

          data?=?[trace1,?trace2,?trace3,?trace4]
          layout?=?go.Layout(
          ????????polar=dict(
          ????????????????radialaxis=dict(
          ????????????????????????visible=True,
          ????????????????????????range=[0,1]
          ????????????????????????)
          ????????????????),
          ????????showlegend=True
          ????????)
          fig?=?go.Figure(data,?layout)
          off.plot(fig)

          畫起來比Excel要麻煩得多。總體而言,如果畫簡單基本的圖形,用Excel是最方便的,如果要畫高級一些的或者是需要更多定制化的圖形,使用python更合適。

          參考資料

          [1]來源:?https://www.jianshu.com/p/9bc9f473dd22
          [2]VLOOKUP函數(shù)最常用的10種用法,你會幾種?:?https://www.douban.com/note/617113346/
          [3]Excel數(shù)據(jù)透視表有什么用途?:?https://www.zhihu.com/question/22484899/answer/39933218

                    --- EOF ---
                                    
          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久超碰大香蕉 | 午夜精品久久久久久久久久久久 | 欧美精品久久久久久久久爆乳 | 精品多人P群无码专区 | 午夜精品电影 |