Pythonpandas对excel的操作实现⽰例
最近经常看到各平台⾥都有Python的⼴告,都是对excel的操作,这⾥明哥收集整理了⼀下pandas对excel的操作⽅法和使⽤过程。本篇介绍 pandas 的DataFrame对列 (Column) 的处理⽅法。⽰例数据请通过明哥的gitee进⾏下载。
增加计算列
pandas 的DataFrame,每⼀⾏或每⼀列都是⼀个序列 (Series)。⽐如:
import pandas as pd
df1 = pd.read_excel('./excel-comp-data.xlsx');
此时,⽤type(df1['city'],显⽰该数据列(column)的类型是series.Series。理解每⼀列都是Series⾮常重要,因为 pandas 基于 numpy,对数据的计算都是整体计算。深刻理解这个,才能理解后⾯要说的诸如apply()函数等。
如果列名(column name)没有空格,则列有两种⽅式表达:
df1['city']
df1.city
如果列名有空格,或者创建新列(即该列不存在,需要创建,第⼀次使⽤的变量),则只能⽤第⼀种表达式。
假设我们要对三个⽉的数据进⾏汇总,可以使⽤下⾯的⽅法。实际上就是创建⼀个新的数据列:
# 由于是创建,不能使⽤ df.Total
df1['Total'] = df1['Jan'] + df1['Feb'] + df1['Mar']
df1['Jan']到df1['Mar']都是Series,所以使⽤+号,可以得到三个Series对应位置的数据合计。
当然,也可以⽤下⾯的⽅式:
df1['total'] = df1.Jan + df1.Feb + df1.Mar
增加条件计算列
假设现在要根据合计数 (Total 列),当 Total ⼤于 200,000 ,类别为 A,否则为 B。在 Excel 中实现⽤的是IF函数,但在 pandas 中需要⽤到 numpy 的where函数:
df1['category'] = np.where(df1['total'] > 200000, 'A', 'B')
在指定位置插⼊列
上⾯⽅法增加的列,位置都是放在最后。如果想要在指定位置插⼊列,要⽤dataframe.insert()⽅法。
假设我们要在state列后⾯插⼊⼀列,这⼀列是state的简称 (abbreviation)。在 Excel 中,根据 state 来到 state 的简称,⼀般⽤VLOOKUP函数。我们⽤两种⽅法来实现,第⼀种⽅法,简称来⾃ Python 的 dict。
数据来源:
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"}
如果我们想根据 dict 的key到对应的值,可以使⽤()⽅法,这个⽅法在不到 key 的时候,不会抛出异常,只是返回 None。⽐如
state_('TEXAS') # 返回 TX
state_('TEXASS') # 返回 None
<()⽅法参数为 key,是⼀个标量值。我们并不能像下⾯这样把整列都传给这个⽅法,⽐如下⾯这样:
df1['abbrev'] = state_(df1['state'])
所以我们需要先构造⼀个Series (abbrev),然后把abbrev赋值给df1['abbrev']:
abbrev = df1['state'].apply(lambda x: state_(x.upper()))
df1['abbrev'] = abbrev    # 在后⾯插⼊列
df1.insert(6, 'abbr', abbrev) # 在指定位置插⼊列
apply()函数值得专门写⼀篇,暂且不细说。
Vlookup 函数功能实现
实现类似 Excel 的VLookup功能,可以⽤()⽅法。为此,需要将state_to_code这个dict的数据加载到DataFrame中。这⾥提供两种⽅法。
⽅法1:把数据放在 excel ⼯作表中,然后读取 Excel ⽂件加载。数据如下:
excel_file = pd.ExcelFile('excel-comp-data.xlsx')
df_abbrev = pd.read_excel(excel_file, sheetname = 'abbrev')
df2 = (df_abbrev, on='state') # 类似数据库的 inner join,不匹配数据不会显⽰
VLookup函数根据位置来匹配,merge()⽅法根据列名来匹配。因为上⾯语句中没有指定连接类型,不匹配的记录不会显⽰。如果需要将df1的数据全部显⽰出来,需要指定merge()⽅法的how参数:df3 = (df_abbrev, on='state', how='left') # 类似数据库的 left join
⽅法2:直接将state_to_code加载到DataFrame。但因为state_to_code全部是标量值 (scalar values),
⽅法有⼀点不同,如下:
# 将 state_to_code 直接加载到 DataFrame
abbr2 = pd.DataFrame(list(state_to_code.items()), columns=['state', 'abbr'])
计算合计数
假如需要对各个⽉份以及⽉份合计数进⾏求和。pandas 可以对Series运⾏sum()⽅法来计算合计:
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 的类型是 series.Series, Jan, Feb 等成为 Series 的 index
sum_row = df[['Jan', 'Feb', 'Mar', 'Total']].sum()
也可以将sum_row转换成DataFrame, 以列的⽅式查看。DataFrame的T⽅法实现⾏列互换。
# 转置变成 DataFrame
df_sum = pd.DataFrame(data=sum_row).T
df_sum
如果想要把合计数放在数据的下⽅,则要稍作加⼯。⾸先通过reindex()函数将df_sum变成与df具有相同的列,然后再通过append()⽅法,将合计⾏放在数据的后⾯:
# 转置变成 DataFrame
df_sum = pd.DataFrame(data=sum_row).T
# 将 df_sum 添加到 df
df_sum = index(lumns)
# append 创建⼀个新的 DataFrame
df_with_total = df.append(df_sum, ignore_index=True)
分类汇总
Excel 的分类汇总功能,在数据功能区,但因为分类汇总需要对数据进⾏排序,并且分类汇总的数据
groupby是什么函数与明细数据混在⼀起,个⼈很少⽤到,分类汇总⼀般使⽤数据透视表。
⽽在 pandas 进⾏分类汇总,可以使⽤DataFrame的groupby()函数,然后再对groupby()⽣成的upby.DataFrameGroupBy对象进⾏求和:
df_groupby = df[['state','Jan', 'Feb','Mar', 'Total']].groupby('state').sum()
df_groupby.head()
数据格式化
pandas 默认的数据显⽰,没有使⽤千分位分隔符,在数据较⼤时,感觉不⽅便。如果需要对数据的显⽰格式化,可以⾃定义⼀个函数number_format(),然后对DataFrame运⾏applymap(number_format)函数。applymap()函数对DataFrame中每⼀个元素都运⾏number_format函数。number_format函数接受的参数必须为标量值,返回的也是标量值。
# 数字格式化
def number_format(x):
return "{:,.0f}".format(x) # 使⽤逗号分隔,没有⼩数位
formated_df = df_groupby.applymap(number_format)
formated_df.head()
数据透视表
pandas 运⾏数据透视表,使⽤pivot_table()⽅法。熟练使⽤pivot_table()需要⼀些练习。这⾥只是介绍最基本的功能:
index 参数:按什么条件进⾏汇总
values 参数:对哪些数据进⾏计算
aggfunc 参数:aggregation function,执⾏什么运算
# pivot table
# pd.pivot_table ⽣成⼀个新的 DataFrame
df_pivot = pd.pivot_table(df, index=['state'], values=['Jan','Feb','Mar','Total'], aggfunc= np.sum)
总结
Pandas可以对Excel进⾏基础的读写操作
Pandas可以实现对Excel各表各⾏各列的增删改查
Pandas可以进⾏表中列⾏筛选等
到此这篇关于Python pandas对excel的操作实现⽰例的⽂章就介绍到这了,更多相关Python pandas对excel操作内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

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