python使用pandas操作excel

pandas 库是基于numpy库 的软件库,因此安装Pandas 之前需要先安装numpy库。默认的pandas不能直接读写excel文件,需要安装读、写库即xlrd、xlwt才可以实现xls后缀的excel文件的读写,要想正常读写xlsx后缀的excel文件,还需要安装openpyxl库 。

pandas详解

转载自:https://blog.csdn.net/weixin_46277553/article/details/123922187?spm=1001.2014.3001.5502

1.什么是pandas

Pandas 这个名字来源于面板数据(Panel Data)与数据分析(data analysis)这两个名词的组合。Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。

2.为什么要学习pandas

numpy能够帮我们处理处理数值型数据,但是这还不够。
很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等
比如:我们通过爬虫获取到了存储在数据库中的数据等等。
因此,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据。

(二)pandas的常用数据类型

1.Series(一维,带标签数组)

import pandas as pd

a = pd.Series([1,5,4,85,87,512])
print(a,type(a))

 从上述结果中我们可以看到Series创建的对象带有索引。

1.1 创建索引

pd.Series([],index=list(string))

b = pd.Series([1,5,4,2,45,45,24,5],index=list('abcdefgh'))
print(b)

 1.2 通过字典创建Series

通过字典也可以创建Series对象,此时字典的键为索引。

import pandas as pd

dic = {
    'name':'苏凉.py',
    'age':'22',
    'qq_num':'787991021',
}
information = pd.Series(dic)
print(information)

 1.3 Series的切片和索引

Series对象本质上由两个数组构成,一个数组构成对象的键(index,索引),一个数组构成对象的值(values),键->值

1.3.1 显示某个值

import pandas as pd

dic = {
    'name':'苏凉.py',
    'age':'22',
    'qq_num':'787991021',
}
information = pd.Series(dic)
print(information)
print('-'*100)
print(information[0])

 1.3.2 显示多个不连续的值

print(information[[0,2,3]])

 1.3.3 显示多个连续的值

print(information[0:3])

 1.3.4 通过索引查找值

print(information[['name','age','wechat']])

 1.4 Series的索引和值属性

对于一个陌生的Series类型,我们可以通过index和values来了解它的索引和值。

1.4.1 Series的索引(index)

print(information.index)

 1.4.2 索引遍历

a = information.index
for i in a:
    print(i)

 1.4.3 Series的值(values)

print(information.values)

 2.DataFrame(二维,Series容器)

import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(1,13).reshape(3,4))
print(a)

 这里可以看到用DataFrame创建数组时存在行索引和列索引。
行索引:表明不同行,横向索引,叫index,0轴,axis=0.
列索引:表明不同列,纵向索引,叫columns,1轴,axis=1.

2.1 创建索引

pd.DataFrame([]),index=list(),columns=list()

a = pd.DataFrame(np.arange(1,13).reshape(3,4),index=list('123'),columns=list('ABCD'))

2.2 通过字典创建DataFrame

方法一:

import pandas as pd


list = {
    'name':['苏凉.py','佚名'],
    'age':['22','15'],
    'QQ_num':['787991021','01234567'],
    'wechat':['lxzy787991021','ym789456']
}
person = pd.DataFrame(list)
print(person)

 方法二:

import pandas as pd

list2 = [
    {'name':'苏凉.py','age':'22','QQ_num':'787991021','wechat':'lxzy787991021'},
    {'name':'佚名','QQ_num':'01234567','wechat':'ym789456'}
]
person = pd.DataFrame(list2)
print(person)

 这里可以看到当我们对应的位置没有输入值时结果NaN

2.3 DataFrame的索引和切片

注:在dataframe中进行取行或者取列操作时,[]中为数字则取行,[]中为字符串则取列!!

2.3.1 取前几行

print(person[:2])

 2.3.2 取某列

print(person['name'])

 2.3.3 取多列

print(person[['name','wechat']])

 2.4 利用DataFrame的loc和iloc方法取值

2.4.1 利用loc获取值

loc时通过标签索引来获取值

2.4.1.1 取某行
print(person.loc[1,:])

 2.4.1.2 取多行
print(person.loc[[0,1]])

 2.4.1.3 取某列
print(person.loc[:,'name'])

 2.4.1.4 取多列
print(person.loc[:,['name','wechat']])

 2.4.2 利用iloc来获取值

iloc是通过位置来获取值
下面列举四个例子即可:

2.4.2.1 获取行
print(person.iloc[0,])

 2.4.2.2 获取列
print(person.iloc[:,2])

 2.4.2.3 获取某行某列
print(person.iloc[0,3])

 2.4.2.4 获取多行多列
print(person.iloc[[0,1],[0,2,3]])

 **************************************************************************************************************************

简单操作excel:

(一)创建文件

import pandas as pd

df = pd.DataFrame()
df.to_excel('D:/Temp01/test.xlsx')
print('创建成功!!')

 1.在创建的表格内插入数据

只需将我们定义的数据传入Dataframe内即可:

import pandas as pd

numb_list = {
    'ID':[1,2,3,4],
    'name':['苏凉','jake','佚名','Tom'],
    'age':[22,18,25,16],
    'QQ_num':[787991021,2544722208,12545654,58456]
}
df = pd.DataFrame(numb_list)
df.to_excel('D:/Temp01/test.xlsx')
print('创建成功!!')

 2.修改索引

利用set_index设置索引

df = df.set_index('ID')

 (二)读取文件

pd.read_excel()常用参数说明:

首先,认识一下pd.read_excel(),函数的官方文档是这么说的:将Excel文件读取到pandas DataFrame中,系统默认支持‘xls’和‘xlsx’后缀的文件名,函数都可以处理,看一下这个函数的所有参数:

io参数

这个参数可以接受的有:字符串str,excel文件,或者路径对象,一般是路径+文件的名字,这是最重要的参数,必须传入:
pd.read_excel(r’F:\data\aa.xlsx’)

sheet_name

这个参数是指定excel表格的第几个sheet表,不指定默认是第一个sheet,对应的值是0,如果需要打开第二个sheet,可以将sheet_name=1,如果你的sheet自定义了名字,则把数字换成你名字即可;

header
这个参数是为了解决是否将前面的表头读入数据表中,如果header = 2,则说明指定位置是2的行作为列名,如果没有设置则说明是所有的数据作为数据,然后另外一行(系统默认输入0-n)作为列名字。
index_col
这个参数是默认是None,和header一样,可以填入数字,意思是设置第几列为行索引。
dtype
这个参数输入可以表示类型的名称字符或者字典,如果dtype=‘str’,则说明整个表格的书数据都转换成字符串的数据类型,如果输入的是字典,则dtype={‘列1’:‘str’,‘列2’:‘int’}则说明每个字段都可以指定不同的数据类型,上面的定义的意思就是第一列是字符串,第二列是整型。

1.导入excel表格

people = pd.read_excel('./People.xlsx') #导入excel表格

2.查看表格形状

print(people.shape) #查看有多少行多少列

3.查看列名

x = people.columns
for i in x:
    print(i)

 3.1 当第一行为空或有其他数据

 遇到上述两种情况在读取列名时,pandas默认第一行为列名,当第一行为空时则需要设置header=某行

import pandas as pd

people = pd.read_excel('./People.xlsx',header = 1)

print(people.columns)

3.2 自定义列名

当打开的文件没有列名时,我们需要设置列名。

import pandas as pd

people = pd.read_excel('./People.xlsx',header=None)
# 自定义列名
people.columns=['ID','Type','Title','FirstName','MiddleName','LastName']
people.set_index('ID',inplace=True)
print(people.columns)
# 保存
people.to_excel('./test.xlsx')
print('save success')

 3.3 指定索引

在上面我们创建了一个test文件。当我们再次打开时,pandas会给我们重新创建一个索引,如下图:

 这时我们需要指定索引

import pandas as pd

people = pd.read_excel('./test.xlsx',index_col="ID")
people.to_excel('./test1.xlsx')
print('save success')

 4.用Series创建行,列,单元格

import pandas as pd

d1 = pd.Series([10,20,30],index=[1,2,3],name='a')
d2 = pd.Series([40,50,60],index=[1,2,3],name='b')
d3 = pd.Series([100,200,300],index=[2,3,4],name='c')

df = pd.DataFrame({d1.name:d1,d2.name:d2,d3.name:d3})
df2 = pd.DataFrame([d1,d2,d3])
print(df)
print('*'*100)
print(df2)

 从上述结果可以看出通过Series创建的值传到Dataframe时需要用字典的形式,否则索引会自动转换为列。

(三)Pandas如何追加写入Excel

想要实现Excel的追加的主要思路为:将原有的数据先读出来,然后与需要存入的数据一并添加即可。

先创建一个excel文件:

import pandas as pd

data = {'city': ['北京', '上海', '广州', '深圳'],
        '2018': [33105, 36011, 22859, 24221]}
data = pd.DataFrame(data)
data.to_excel('excel追加.xlsx', index=False)

 方法一:append()

import pandas as pd

# 先将Excel中原有的数据读取出来
original_data = pd.read_excel('excel追加.xlsx')

data2 = {'city': ['北京', '上海', '广州', '深圳'],
         '2018': ['a', 'b', 'c', 'd']}
data2 = pd.DataFrame(data2)
# 将新数据与旧数据合并起来
save_data = original_data.append(data2)
save_data.to_excel('excel追加.xlsx', index=False)

 方法二:concat()

import pandas as pd

# 先将Excel中原有的数据读取出来
original_data = pd.read_excel('excel追加.xlsx')

data2 = {'city': ['北京', '上海', '广州', '深圳'],
         '2018': ['a', 'b', 'c', 'd']}
data2 = pd.DataFrame(data2)
# 将新数据与旧数据合并起来
save_data = pd.concat([original_data, data2], axis=0)
save_data.to_excel('excel追加.xlsx', index=False)

使用ExcelWriter()类将数据导出至多个excel页签

在pandas中我们通常使用to_excel()方法将dataframe导出至Excel文件上,如果需要将多个不同的dataframe导出到同一个Excel文件的不同Sheet页,可以使用pandas.ExcelWriter()类来实现。

语法:

ExcelWriter(path, engine=None, date_format=None, datetime_format=None,mode=‘w’)

path:xls或xlsx文件的路径;
engine:可选参数,默认值为"xlwt",对于xls文件该参数值为"xlwt"有效,对于xlsx文件该参数值为"openpyxl"有效;
date_format:格式字符串,用于写入Excel文件的日期(例如“ YYYY-MM-DD”);
datetime_format:写入Excel文件的日期时间对象的格式字符串。 (例如“ YYYY-MM-DD HH:MM:SS”)
mode:可选参数,{‘w’, ‘a’}, 默认为 ‘w’,即擦除目标文件原内容,将dataframe覆盖式导出至目标Excel文件。当为’a’时,将dataframe追加导入至目标Excel文件,目标文件中原内容保留。此处需注意,如果为’a’,且导出的为xlsx文件,需将该参数修改为"openpyxl"。

import pandas as pd
import numpy as np
test=pd.DataFrame(np.arange(0,100).reshape([25,4]))
test1=pd.DataFrame(np.arange(100,200).reshape([25,4]))
writer = pd.ExcelWriter(r"C:\Users\user_name\Desktop\test.xlsx",engine="openpyxl",mode="a")#追加式导出,不覆目标文件盖原有内容
test.to_excel(writer,"test",index=False)#将test导出至名为test的Sheet页上
test1.to_excel(writer,"test1",index=False)#将test1导出至名为test1的Sheet页上
writer.save()

小试牛刀

import pandas as pd
import os

def save_excel(path,datamy):
    data = {'编号': ['例如:xx1'],
            '名字': ["例如:dog"],
            '重复名字': ["例如:small"],
            '年纪': ["例如:300"],
            '岁数': ["例如:5000"]}
    if os.path.exists(path)==False:
        data1 = pd.DataFrame(data)
        data1.to_excel(path, index=False)
        print("新建表格成功!")
    # sheet_name默认为0,即读取第一个sheet的数据
    original_data = pd.read_excel(path, sheet_name=0,engine='openpyxl')
    # print(original_data.columns)#打印列名
    if len(data)!=len(datamy):
        print("数据格式不太对")
    else:
        for i in range(len(data)):
            data.update({list(data.keys())[i]:[datamy[i]]})
        data = pd.DataFrame(data)
        save_data = original_data.append(data)
        save_data.to_excel(path, index=False)
        print("Done!")

if __name__=="__main__":
    #  每次都需要修改的路径
    path = "测试.xlsx"
    datamy=["xx2","2499","0.2","300","2.5k"]
    save_excel(path,datamy)

 

posted @ 2022-09-11 10:27  菜芽caiya  阅读(5664)  评论(0编辑  收藏  举报