pandas操作excel的应用

1、pandas基本读取和写入excel表格

1.1、pandas读取excel表格

import pandas as pd
# 创建空DataFrame实例,DataFrame就是数据帧
df = pd.DataFrame({'id':[1,2,3],'name':['张三','李四','王五']})
# pandas默认第一个列会自动创建索引,使用set_index()方法指定索引
df = df.set_index('id')
df.to_excel("d:/output.xlsx")
print('Done!')

1.2、pandas写入excel表格

import pandas as pd
# index_col参数表示读取时就指定索引列
people = pd.read_excel("D:\py_workspace\pandas_excel\People.xlsx",index_col='ID')

# header=1表示跳过第一行,从第二行开始;当第一行位脏数据时可以这么设置,如果第一行每一列全部为空,那么pandas自动从第二行开始
# people = pd.read_excel("D:\py_workspace\pandas_excel\People.xlsx",header=1)
# shape表示属性,返回元组,元组第一个表示行,第二表示列

# 如果我们excel表格没有列名,需要把header设置为None,那么默认给列名是0,1,2...形式
# people = pd.read_excel("D:\py_workspace\pandas_excel\People.xlsx",header=None)
# 设置列名
# people.columns= ['ID','Type','Title','FirstName','MiddleName','LastName']
# 设置ID列为索引,inplace=True表示直接修改这个DataFrame
# people.set_index('ID',inplace=True) # 注意区别people = people.set_index('ID') 代码
print(people.shape) #输出结果:(19972, 6)
# columns属性是列,类型<class 'pandas.core.indexes.base.Index'>
print(people.columns) # 输出结果:Index(['ID', 'Type', 'Title', 'FirstName', 'MiddleName', 'LastName'], dtype='object')
print("前五行\n",people.head(5))
print("后三行\n",people.tail(3))
# 由于读取pepole文件时index_col指定了索引列,所以新产生的索引列就是ID,不会自动生成一个索引列
people.to_excel("D:\outpepole.xlsx")

【注意】

(1)读取excel表格时可以read_excel()方法的index_col属性指定索引列,这样就不会自动生成索引列;该方法的header属性用来指定标题头,可以设置header=None表示没有列名,就会自动生成列名如0,1,2.....等

(2)DataFarme的shape属性输出行数和列数组成的元组,而DataFrame的columns属性则显示所有的列名,DataFarme的index属性表示索引序号;


2、pandas操作Excel列/行/单元格

我们需要注意pandas操作excel表格其实就是DataFrame,而DataFrame是个二维的;其中我们可以把excel中的每一列理解为Series序列对象,而DataFrame可以有Series序列对象组成。

2.1、列/行/单元格基本操作

【例子1】

import pandas as pd
# 生成一个空的序列对象
# s1 = pd.Series()
# s1.index表示series的名字,s1.name表示series的索引,series的data属性在以后版本将过期
d = {"x":100,"y":200,"z":300}
s1 = pd.Series(d) # x/y/z是索引,100/200/300是列值
print(s1)
print(s1.index,s1.name) # x/y/z,None

【例子2】

import pandas as pd
# 列表
L1 = [400,500,600]
L2 = ['a','b','c']
# L1为data,L2为索引
s2 = pd.Series(L1,index=L2)
print(s2)

【例子3】

import pandas as pd
s_a = pd.Series([1,2,3],index=[1,2,3],name='A')
s_b = pd.Series([10,20,30],index=[1,2,3],name='B')
s_c = pd.Series([100,200,300],index=[1,2,3],name='C')

df = pd.DataFrame({s_a.name:s_a.data,s_b.name:s_b.data,s_c.name:s_c.data})
print(df)

【例子4】

import pandas as pd
s_a = pd.Series([1,2,3],index=[1,2,3],name='A')
s_b = pd.Series([10,20,30],index=[1,2,3],name='B')
s_c = pd.Series([100,200,300],index=[1,2,3],name='C')

# 这种方法是把每个序列作为一行放入到DataFrame中
df_1 = pd.DataFrame([s_a,s_b,s_c])
print(df_1)

2.2、pandas实现excel表格自动填充

import pandas as pd
from datetime import date,timedelta
def add_month(d,md):
    """
    计算月份
    :param d: 
    :param md: 
    :return: 
    """
    yd = md//12
    m = d.month +md%12
    if m!=12:
        yd +=m//12
        m = m % 12
    return date(d.year+yd,m,d.day)

# skiprows=3跳过前三个空行;
# usecols="C:F"表示从C列到F列,也可以写成usecols="C,D,E,F"
# dtype={'ID':str} 设置ID列为字符串类型


books = pd.read_excel("./Books.xlsx",skiprows=3,usecols="C:F",index_col=None,dtype={'ID':str,'InStore':str,'Date':str}) # index_col列索引
# 其实books的某一列就是一个Series对象
# type(books['ID'])就是个series序列对象
# books['ID'].at[0]=100
start_date = date(2018,1,13)
for i in books.index: # books.index就是0到19
    # books.at[i,'ID']等效于books['ID'].at[i]
    books['ID'].at[i] = i+1
    books['InStore'].at[i] = 'Yes' if i%2==0 else 'No'
    # 日期天数自动加1,timedelta只能加天、小时、分钟、秒
    # books['Date'].at[i] = start_date + timedelta(days=i)
    # 加年份
    # books['Date'].at[i] = date(start_date.year+i,start_date.month,start_date.day)
    books['Date'].at[i] = add_month(start_date,i)
# excel默认空值是NaN就是float64类型

print(books)
# 设置ID列为索引,不使用自动产生的索引
books = books.set_index("ID") # books.set_index("ID",inplace=True)这个是直接修改
books.to_excel("./output.xlsx")

【注意】

(1)在读取excel表格时,如果从几行开始读取可以使用read_excel()方法的参数skiprows来跳过前面多少行;而usecols参数表示从第几到第几列读取;参数dtype通过每列索引来指定该列数据的类型是是什么,而dtype是字典类型;

(2)DataFarme数据帧的index属性表示索引的序号从0开始,DataFarme的at[]方法就是获取某个位置的值;DataFarme的loc[]方法表示定位到某个位置;DataFrame数据帧的set_index()表示设置索引。

扫描二维码关注公众号,回复: 6417138 查看本文章

2.3、对excel中进行计算

import pandas as pd
books = pd.read_excel("./Books.xlsx",index_col="ID") # index_col指定索引列
# 计算Price的值等于ListPrice列和Discount列相乘
# pandas会自动对齐单元格进行计算
# books['Price'] = books['ListPrice'] * books['Discount']
for i in books.index: # books.index表示索引,就是对每一行就行处理
    books['Price'].at[i] = books['ListPrice'].at[i] * books['Discount'].at[i] # 等同于上面的计算

# 给每本书价格涨价2元
def add_price(x):
    return x+2
# print(books['ListPrice'].dtype)
# books['ListPrice'] = books['ListPrice'] +2
# books['ListPrice'] = books['ListPrice'].apply(add_price)
# pandas中的apply()方法是把DataFrame的一列或几列遍历计算
books['ListPrice'] = books['ListPrice'].apply(lambda x:x+2)
print(books)

2.4、对excel中进行排序或多重排序

pandas对excel进行爬行使用的是DataFrame的sort_values()方法:

## 参数
sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
#### 参数说明
axis:0按照行名排序;1按照列名排序
level:默认None,否则按照给定的level顺序排列---貌似并不是,文档
ascending:默认True升序排列;False降序排列
inplace:默认False,否则排序之后的数据直接替换原来的数据框
kind:默认quicksort,排序的方法
na_position:缺失值默认排在最后{"first","last"}
by:按照那一列数据进行排序,但是by参数貌似不建议使用
import pandas as pd
products  = pd.read_excel("./List.xlsx", index_col="ID")
# sort_values()方法是对DataFrame进行排序,其中的by表示指定排序字段
# sort_values()方法的ascending参数默认是从小到大爬行,默认值是True
products.sort_values(by='Price',inplace=True,ascending=False) # inplace=True表示直接修改当前DataFrame不会新增一个
print(products)

print("="*30,"多重排序","="*30)
products_2  = pd.read_excel("./List.xlsx", index_col="ID")
# 多重排序时sort_values()方法的by属性是一个列表,不是一个字符串
# 此时的ascending时一个列表,其实这个列表跟by属性的列表是一一对应的
products_2.sort_values(by=['Worthy','Price'],inplace=True,ascending=[True,False])
print(products_2)

【注意】在单一排序时sort_values()中by是字符串指定到那一列就行,如果需要进行多重排序则sort_values()方法中的by参数为列表类型需要指定多列,而ascending也是列表类型与by中列是对应关系。

2.5、excel中数据过滤和刷选

DataFrame中loc方法使用的是column列名和index索引名进行定位

import pandas as pd
students = pd.read_excel("./Students.xlsx",index_col="ID")
def age18_to_30(age):
    # return age>=18 and age<30
    return 18<=age<30 # 这种写法只限python语言

def level_score(score):
    return 85<= score <=100
# loc需要指定列表形式数据,指定某一列;loc会新生成一个DataFrame
# 3apply方法是Serises序列对象的方法
# students = students.loc[students['Age'].apply(age18_to_30)].loc[students['Score'].apply(level_score)]
# 上面的第二种写法,这是pandas特有写法
# students = students.loc[students.Age.apply(age18_to_30)].loc[students.Score.apply(level_score)]
# 第三种lambda表达式写法
students = students.loc[students['Age'].apply( lambda x: 18 <= x < 30)]\
    .loc[students['Score'].apply(lambda y: 85 <= y <= 100)]

print(students)

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/91422685