python处理复杂excel_Python中利⽤Pandas处理复杂Excel数
据⽅法解析
关于Excel数据处理,很多同学可能使⽤过Pyhton的pandas模块,⽤它可以轻松地读取和转换Excel数据。但是实际中Excel表格结构可能⽐较杂乱,数据会分散不同的⼯作表中,⽽且在表格中分布很乱,这种情况下啊直接使⽤pandas就会⾮常吃⼒。本⽂⾍⾍给⼤家介绍使⽤pandas和openpyxl读取这样的数据的⽅法。
问题缘起
pandas read_excel函数在读取Excel⼯作表⽅⾯做得很好。但是,如果数据不是从头开始,不是从单元格A1开始的连续表格,则结果会不是很好。⽐如下⾯⼀个销售表,使⽤read_excel读取:
读取的结果如下所⽰:
结果中标题表头变成了Unnamed,⽽且还会额外增加很多职位NaN列,字段为空的列的值也会被转换为NaN,这显然不是我们所期望的。
header和usecols参数
python怎么读取excel的数据
对这样的⾮标准格式的表格,我们可以使⽤read_excel()的header和usecols参数来控制选择的需要读取的列。
importpandasaspd
frompathlibimportPath
src_file='sales.xlsx'
结果的DataFrame包含了我们期望的数据。
代码中使⽤header和usecols参数设定了⽤于显⽰标题的列和需要读取的字段:
header参数为⼀个整数,从0开始索引,其为选择的⾏,⽐如1表⽰Excel中的第2⾏。
usecols参数设定选择的Excel列范围范围(A-…),例如,B:F表⽰读取B到F列。
在某些情况下,可能希望将列定义为数字列表。⽐如,可以定义整数列数:
ad_excel(src_file,header=1,usecols=[1,2,3,4,5])
这对对⼤型数据集(例如,每3列或仅偶数列)要遵循⼀定的数字模式,则这个参数⽅法会很有⽤。usecols还可以设定从列名列表读取。⽐如上⾯的例⼦也可以这样写:
ad_excel(
src_file,
header=1,
usecols=['item_type','orderid','orderdate','state','priority'])
列顺序⽀持⾃由选择,这种命名列列表的⽅式实际中很有⽤。
usecols⽀持⼀个回调函数column_check,可通过该函数对数据进⾏处理。
下⾯是⼀个简单的⽰例:
defcolumn_check(x):
if'unnamed'inx.lower():
returnFalse
if'priority'inx.lower():
returnFalse
if'order'inx.lower():
returnTrue
returnTrue
ad_excel(src_file,header=1,usecols=column_check)
column_check按名称解析每列,每列通过定义True或False,来选择是否读取。
usecols也可以使⽤lambda表达式。下⾯的⽰例中定义的需要显⽰的字段列表。为了进⾏⽐较,通过将名称转换为⼩写来规范化。
cols_to_use=['item_type','orderid','orderdate','state','priority']
ad_excel(src_file,
header=1,
usecols=lambdax:x.lower()incols_to_use)
回调函数为我们提供了许多灵活性,可以处理Excel⽂件的实际混乱情况。
关于read_exce函数更多参数可以查看官⽅⽂档,下⾯是⼀个总结表格:
结合openpyxl
在某些情况下,数据甚⾄可能在Excel中变得更加复杂。在下⾯⽰例中,我们有⼀个ship_cost要读取的表。如果必须使⽤这样的⽂件,那么只⽤pandas函数和选项也很难做到。在这种情况下,可以直接使⽤openpyxl解析⽂件并将数据转换为pandas DataFrame。⽐如要读取下⾯⽰例的数据:
fromopenpyxlimportload_workbook
importpandasaspd
frompathlibimportPath
src_file='sales1.xlsx'
加载整个⼯作簿:
cc=load_workbook(filename=src_file)
查看所有⼯作表:
cc.sheetnames
['sales', 'shipping_rates']
要访问特定的⼯作表:
sheet=cc['shipping_rates']
要查看所有命名表的列表:
sheet.tables.keys()
dict_keys(['ship_cost'])
该键对应于Excel中分配给表的名称。这样就可以设定要读取的Excel范围:
lookup_table=sheet.tables['ship_cost']
f
'C8:E16'
这样就获得了要加载的数据范围。最后将其转换为pandas DataFrame即可。遍历每⼀⾏并转换为DataFrame:data=sheet[f]
rows_list=[]
forrowindata:
cols=[]
forcolinrow:
cols.append(col.value)
rows_list.append(cols)
df=pd.DataFrame(data=rows_list[1:],index=None,columns=rows_list[0])
结果数据框:
总结
在理想情况下,使⽤的数据将采⽤简单⼀致的格式。在本⽂中,我们介绍了在Pandas下通过参数轻松删除⾏和列以使其格式更加合理。尤其是结合openpyxl的情况下可以让我们读取Excel数据更加灵活,可以处理⽐较复杂的表格数据。

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