最近經(jīng)常看到各平臺里都有Python的廣告,都是對excel的操作,這里明哥收集整理了一下pandas對excel的操作方法和使用過程。本篇介紹 pandas 的 DataFrame
對列 (Column) 的處理方法。示例數(shù)據(jù)請通過明哥的gitee進行下載。
增加計算列
pandas 的 DataFrame
,每一行或每一列都是一個序列 (Series
)。比如:
1
2
|
import pandas as pd df1 = pd.read_excel( './excel-comp-data.xlsx' ); |
此時,用 type(df1['city']
,顯示該數(shù)據(jù)列(column)的類型是 pandas.core.series.Series
。理解每一列都是 Series
非常重要,因為 pandas 基于 numpy,對數(shù)據(jù)的計算都是整體計算。深刻理解這個,才能理解后面要說的諸如 apply()
函數(shù)等。
如果列名 (column name)沒有空格,則列有兩種方式表達:
1
2
|
df1[ 'city' ] df1.city |
如果列名有空格,或者創(chuàng)建新列(即該列不存在,需要創(chuàng)建,第一次使用的變量),則只能用第一種表達式。
假設(shè)我們要對三個月的數(shù)據(jù)進行匯總,可以使用下面的方法。實際上就是創(chuàng)建一個新的數(shù)據(jù)列:
1
2
|
# 由于是創(chuàng)建,不能使用 df.Total df1[ 'Total' ] = df1[ 'Jan' ] + df1[ 'Feb' ] + df1[ 'Mar' ] |
df1['Jan']
到 df1['Mar']
都是 Series
,所以使用 +
號,可以得到三個 Series
對應(yīng)位置的數(shù)據(jù)合計。
當然,也可以用下面的方式:
1
|
df1[ 'total' ] = df1.Jan + df1.Feb + df1.Mar |
增加條件計算列
假設(shè)現(xiàn)在要根據(jù)合計數(shù) (Total 列),當 Total 大于 200,000 ,類別為 A,否則為 B。在 Excel 中實現(xiàn)用的是 IF
函數(shù),但在 pandas 中需要用到 numpy 的 where
函數(shù):
1
|
df1[ 'category' ] = np.where(df1[ 'total' ] > 200000 , 'A' , 'B' ) |
在指定位置插入列
上面方法增加的列,位置都是放在最后。如果想要在指定位置插入列,要用 dataframe.insert()
方法。假設(shè)我們要在 state
列后面插入一列,這一列是 state
的簡稱 (abbreviation)。在 Excel 中,根據(jù) state 來找到 state 的簡稱 ,一般用 VLOOKUP
函數(shù)。我們用兩種方法來實現(xiàn),第一種方法,簡稱來自 Python 的 dict。
數(shù)據(jù)來源:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
state_to_code = { "VERMONT" : "VT" , "GEORGIA" : "GA" , "IOWA" : "IA" , "Armed Forces Pacific" : "AP" , "GUAM" : "GU" , "KANSAS" : "KS" , "FLORIDA" : "FL" , "AMERICAN SAMOA" : "AS" , "NORTH CAROLINA" : "NC" , "HAWAII" : "HI" , "NEW YORK" : "NY" , "CALIFORNIA" : "CA" , "ALABAMA" : "AL" , "IDAHO" : "ID" , "FEDERATED STATES OF MICRONESIA" : "FM" , "Armed Forces Americas" : "AA" , "DELAWARE" : "DE" , "ALASKA" : "AK" , "ILLINOIS" : "IL" , "Armed Forces Africa" : "AE" , "SOUTH DAKOTA" : "SD" , "CONNECTICUT" : "CT" , "MONTANA" : "MT" , "MASSACHUSETTS" : "MA" , "PUERTO RICO" : "PR" , "Armed Forces Canada" : "AE" , "NEW HAMPSHIRE" : "NH" , "MARYLAND" : "MD" , "NEW MEXICO" : "NM" , "MISSISSIPPI" : "MS" , "TENNESSEE" : "TN" , "PALAU" : "PW" , "COLORADO" : "CO" , "Armed Forces Middle East" : "AE" , "NEW JERSEY" : "NJ" , "UTAH" : "UT" , "MICHIGAN" : "MI" , "WEST VIRGINIA" : "WV" , "WASHINGTON" : "WA" , "MINNESOTA" : "MN" , "OREGON" : "OR" , "VIRGINIA" : "VA" , "VIRGIN ISLANDS" : "VI" , "MARSHALL ISLANDS" : "MH" , "WYOMING" : "WY" , "OHIO" : "OH" , "SOUTH CAROLINA" : "SC" , "INDIANA" : "IN" , "NEVADA" : "NV" , "LOUISIANA" : "LA" , "NORTHERN MARIANA ISLANDS" : "MP" , "NEBRASKA" : "NE" , "ARIZONA" : "AZ" , "WISCONSIN" : "WI" , "NORTH DAKOTA" : "ND" , "Armed Forces Europe" : "AE" , "PENNSYLVANIA" : "PA" , "OKLAHOMA" : "OK" , "KENTUCKY" : "KY" , "RHODE ISLAND" : "RI" , "DISTRICT OF COLUMBIA" : "DC" , "ARKANSAS" : "AR" , "MISSOURI" : "MO" , "TEXAS" : "TX" , "MAINE" : "ME" } |
如果我們想根據(jù) dict 的 key
找到對應(yīng)的值,可以使用 dict.get()
方法,這個方法在找不到 key 的時候,不會拋出異常,只是返回 None。比如
1
2
|
state_to_code.get( 'TEXAS' ) # 返回 TX state_to_code.get( 'TEXASS' ) # 返回 None |
dict.get()
方法參數(shù)為 key,是一個標量值。我們并不能像下面這樣把整列都傳給這個方法,比如下面這樣:
1
|
df1[ 'abbrev' ] = state_to_code.get(df1[ 'state' ]) |
所以我們需要先構(gòu)造一個 Series (abbrev)
,然后把 abbrev
賦值給 df1['abbrev']
:
1
2
3
|
abbrev = df1[ 'state' ]. apply ( lambda x: state_to_code.get(x.upper())) df1[ 'abbrev' ] = abbrev # 在后面插入列 df1.insert( 6 , 'abbr' , abbrev) # 在指定位置插入列 |
apply()
函數(shù)值得專門寫一篇,暫且不細說。
Vlookup 函數(shù)功能實現(xiàn)
實現(xiàn)類似 Excel 的 VLookup
功能,可以用 dataframe.merge()
方法。為此,需要將 state_to_code
這個 dict
的數(shù)據(jù)加載到 DataFrame
中。這里提供兩種方法。
方法1: 把數(shù)據(jù)放在 excel 工作表中,然后讀取 Excel 文件加載。數(shù)據(jù)如下:
1
2
3
|
excel_file = pd.ExcelFile( 'excel-comp-data.xlsx' ) df_abbrev = pd.read_excel(excel_file, sheetname = 'abbrev' ) df2 = df1.merge(df_abbrev, on = 'state' ) # 類似數(shù)據(jù)庫的 inner join,不匹配數(shù)據(jù)不會顯示 |
VLookup
函數(shù)根據(jù)位置來匹配,merge()
方法根據(jù)列名來匹配。因為上面語句中沒有指定連接類型,不匹配的記錄不會顯示。如果需要將 df1
的數(shù)據(jù)全部顯示出來,需要指定 merge()
方法的 how
參數(shù):
1
|
df3 = df1.merge(df_abbrev, on = 'state' , how = 'left' ) # 類似數(shù)據(jù)庫的 left join |
方法2:直接將 state_to_code
加載到 DataFrame
。但因為 state_to_code
全部是標量值 (scalar values),方法有一點不同,如下:
1
2
|
# 將 state_to_code 直接加載到 DataFrame abbr2 = pd.DataFrame( list (state_to_code.items()), columns = [ 'state' , 'abbr' ]) |
計算合計數(shù)
假如需要對各個月份以及月份合計數(shù)進行求和。pandas 可以對 Series
運行 sum()
方法來計算合計:
1
2
3
4
5
6
7
8
|
import pandas as pd import numpy as np df = pd.read_excel( './excel-comp-data.xlsx' ); df[ 'Total' ] = df.Jan + df.Feb + df.Mar # sum_row 的類型是 pandas.core.series.Series, Jan, Feb 等成為 Series 的 index sum_row = df[[ 'Jan' , 'Feb' , 'Mar' , 'Total' ]]. sum () |
也可以將 sum_row
轉(zhuǎn)換成 DataFrame
, 以列的方式查看。DataFrame
的 T
方法實現(xiàn)行列互換。
1
2
3
|
# 轉(zhuǎn)置變成 DataFrame df_sum = pd.DataFrame(data = sum_row).T df_sum |
如果想要把合計數(shù)放在數(shù)據(jù)的下方,則要稍作加工。首先通過 reindex()
函數(shù)將 df_sum
變成與 df
具有相同的列,然后再通過 append()
方法,將合計行放在數(shù)據(jù)的后面:
1
2
3
4
5
6
7
8
|
# 轉(zhuǎn)置變成 DataFrame df_sum = pd.DataFrame(data = sum_row).T # 將 df_sum 添加到 df df_sum = df_sum.reindex(columns = df.columns) # append 創(chuàng)建一個新的 DataFrame df_with_total = df.append(df_sum, ignore_index = True ) |
分類匯總
Excel 的分類匯總功能,在數(shù)據(jù)功能區(qū),但因為分類匯總需要對數(shù)據(jù)進行排序,并且分類匯總的數(shù)據(jù)與明細數(shù)據(jù)混在一起,個人很少用到,分類匯總一般使用數(shù)據(jù)透視表。
而在 pandas 進行分類匯總,可以使用 DataFrame
的 groupby()
函數(shù),然后再對 groupby()
生成的 pandas.core.groupby.DataFrameGroupBy
對象進行求和:
1
2
|
df_groupby = df[[ 'state' , 'Jan' , 'Feb' , 'Mar' , 'Total' ]].groupby( 'state' ). sum () df_groupby.head() |
數(shù)據(jù)格式化
pandas 默認的數(shù)據(jù)顯示,沒有使用千分位分隔符,在數(shù)據(jù)較大時,感覺不方便。如果需要對數(shù)據(jù)的顯示格式化,可以自定義一個函數(shù) number_format()
,然后對 DataFrame
運行 applymap(number_format)
函數(shù)。applymap()
函數(shù)對 DataFrame
中每一個元素都運行 number_format
函數(shù)。number_format
函數(shù)接受的參數(shù)必須為標量值,返回的也是標量值。
1
2
3
4
5
6
|
# 數(shù)字格式化 def number_format(x): return "{:,.0f}" . format (x) # 使用逗號分隔,沒有小數(shù)位 formated_df = df_groupby.applymap(number_format) formated_df.head() |
數(shù)據(jù)透視表
pandas 運行數(shù)據(jù)透視表,使用 pivot_table()
方法。熟練使用 pivot_table()
需要一些練習。這里只是介紹最基本的功能:
- index 參數(shù): 按什么條件進行匯總
- values 參數(shù):對哪些數(shù)據(jù)進行計算
- aggfunc 參數(shù):aggregation function,執(zhí)行什么運算
1
2
3
|
# pivot table # pd.pivot_table 生成一個新的 DataFrame df_pivot = pd.pivot_table(df, index = [ 'state' ], values = [ 'Jan' , 'Feb' , 'Mar' , 'Total' ], aggfunc = np. sum ) |
總結(jié)
Pandas可以對Excel進行基礎(chǔ)的讀寫操作
Pandas可以實現(xiàn)對Excel各表各行各列的增刪改查
Pandas可以進行表中列行篩選等
到此這篇關(guān)于Python pandas對excel的操作實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python pandas對excel操作內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/tonyoo/article/details/105401954