python实现vlookup功能_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 的分类汇总功能,在数据功能区,但因为分类汇总需要对数据进⾏排序,并且分类汇总的数据与明细数据混在⼀起,个⼈很少⽤到,分类汇总⼀般使⽤数据透视表。
⽽在 pandas 进⾏分类汇总,可以使⽤ DataFrame 的 groupby() 函数,然后再对 groupby() ⽣成的
df_groupby = df[['state','Jan', 'Feb','Mar', 'Total']].groupby('state').sum()
df_groupby.head()
groupby是什么函数数据格式化
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操作内容请搜索随便开发⽹以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持随便开发⽹!