一.用pandas创建Excel文件

1.创建一个空格的Excle文件

import pandas as pd

df = pd.DataFrame()
df.to_excel('新建的.xlsx')

效果:

    pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel

 

 

 2.创建一个有内容的Excel文件

import pandas as pd
df = pd.DataFrame({"ID":[1,2,3],"Name":["张三","李四","王五"]})
df.to_excel('新建的.xlsx')

效果:

  pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_02

 

3.如果不想要自带的索引,想用自己的ID作为索引,就可以使用一下代码

import pandas as pd
df = pd.DataFrame({"ID":[1,2,3],"Name":["张三","李四","王五"]})
df = df.set_index("ID")
df.to_excel('新建的.xlsx')

效果:

  pandas玩Excel ---小白笔记1,感谢Timothy老师_数据_03

 

 

 二.用pandas打开读取Excel文件

1.查看Excel的总行列

import pandas as pd
exl = pd.read_excel("新建的.xlsx")
print(exl.shape)

  结果是:(3, 2)  

2.查看Excel所有的列名

import pandas as pd
exl = pd.read_excel("新建的.xlsx")
print(exl.columns)

  结果是:Index(['ID', 'Name'], dtype='object')

3.查看Excel前n行数据

import pandas as pd
exl = pd.read_excel("新建的.xlsx")
#默认是5行,可以自己定义,写2只是显示前两行
print(exl.head(2))

  结果是:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_04

 

 

 4.查看Excel后n行数据

import pandas as pd
exl = pd.read_excel("新建的.xlsx")
print(exl.tail(1))

  结果是:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_05

 

5.如果Excel文件是这样子的:

  pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_06

 

  想要从第2行读取,就用header参数,默认是0,可以指定送第n行读取,这里注意,如果第一行是空行,就不需要用header参数指定

import pandas as pd
exl = pd.read_excel("新建的.xlsx",header=1)
print(exl)

  效果是:

       pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_07

 

 

 6.如果表格没有列头,比如下图,此时就默认是0,1这样子

    pandas玩Excel ---小白笔记1,感谢Timothy老师_数据_08

 

 

 

import pandas as pd
exl = pd.read_excel("新建的.xlsx",header=None)
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_09

 

 

 7.遇到6这种情况 我们想要设置表头就需要指定设置表头操作,并且不想要默认的索引,用ID代替

import pandas as pd
exl = pd.read_excel("新建的.xlsx",header=None)
exl.columns =["ID","name"]
exl.set_index("ID",inplace=True)
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_10

 

 

 8.读取文件的时候可以指定索引列

import pandas as pd
exl = pd.read_excel("新建的.xlsx",index_col="ID")
print(exl)

  效果是:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_11pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_12

 

 

 三.pandas的行和列计算

1.把序列写入excel中,把每个序列看做一列写入

import pandas as pd
s1 = pd.Series([1,2,3],index=[1,2,3],name='A')
s2 = pd.Series([10,20,30],index=[1,2,3],name='B')
s3 = pd.Series([100,200,300],index=[1,2,3],name='C')
exl = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_13

 

 

 2.把序列写入excel中,把每个序列看做一行写入

import pandas as pd
s1 = pd.Series([1,2,3],index=[1,2,3],name='A')
s2 = pd.Series([10,20,30],index=[1,2,3],name='B')
s3 = pd.Series([100,200,300],index=[1,2,3],name='C')
exl = pd.DataFrame([s1,s2,s3])
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_14

 

 

 3.s1 = pd.Series([1,2,3],index=[1,2,3],name='A')这里面的index是和pandas里面的index对齐关系,比如:

import pandas as pd
s1 = pd.Series([1,2,3],index=[1,2,3],name='A')
s2 = pd.Series([10,20,30],index=[1,2,3],name='B')
s3 = pd.Series([100,200,300],index=[1,2,4],name='C')
exl = pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_15

 

 

 4.pandas 填充Excel

  在pandas里面的每一列其实是一个序列Series。对序列的操作填写就用at函数,下图的数据不是顶格开始写的,读取的时候用skiprows=3,usecols='C:F'来指定读取的开始位置和读取位置usecols也可以写成usecols=“C”,"D","E",“F”,pandas读取Excel的时候如果是空的单元格,默认是浮点类型的。写字符串就会报错,这个时候就需要指定一下指定列的数据类型了。用到的参数是dtype={}字典,来指定

pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_16

 

 

 

import pandas as pd
from datetime import date,timedelta
case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
start_data = date(2020,1,1)
for i in case_exl.index:
    case_exl.ID.at[i]=i+1
    case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
    case_exl.执行日期.at[i] = start_data
print(case_exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_17

 

 

 5.给日期的每一行加1天,只需要循环的时候加 timedelta(days=i)

import pandas as pd
from datetime import date,timedelta
case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
start_data = date(2020,1,25)
for i in case_exl.index:
    case_exl.ID.at[i]=i+1
    case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
    case_exl.执行日期.at[i] = start_data+timedelta(days=i)
print(case_exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_18

 

 

 6.给日期的每一行加1年,date(start_data.year+i,start_data.month,start_data.day)

import pandas as pd
from datetime import date,timedelta
case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
start_data = date(2020,1,25)
for i in case_exl.index:
    case_exl.ID.at[i]=i+1
    case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
    case_exl.执行日期.at[i] = date(start_data.year+i,start_data.month,start_data.day)
print(case_exl)

效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_数据_19

 

 

  7.给日期的每一行加1月,就不能这样写了date(start_data.year,start_data.month+i,start_data.day)

      pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_20

 

 

   正确的写法是:

import pandas as pd
from datetime import date,timedelta
case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
start_data = date(2020,10,25)
#d是给进来的时间,md是要加的月数
def add_month(d,md):
    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)
for i in case_exl.index:
    case_exl.ID.at[i]=i+1
    case_exl.是否通过.at[i] = "Yes" if i%2 ==0 else 'NO'
    case_exl.执行日期.at[i] = add_month(start_data,i)
case_exl.set_index("ID",inplace=True)
case_exl.to_excel('填充.xlsx')
print(case_exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_21pandas玩Excel ---小白笔记1,感谢Timothy老师_数据_22

 

 

 8.以上4,5,6,7,是在序列中来填充数据的,下面直接是直接在DataFrame中填充数据

# *_*coding:utf-8 *_*
# @Author : zyb
import pandas as pd
from datetime import date,timedelta
case_exl = pd.read_excel("填充.xlsx",skiprows=3,usecols='C:F',dtype={'ID':str,"是否通过":str,"执行日期":str})
start_data = date(2020,10,25)
#d是给进来的时间,md是要加的月数
def add_month(d,md):
    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)
for i in case_exl.index:
    case_exl.at[i,"ID"]=i+1
    case_exl.at[i,"是否通过"] = "Yes" if i%2 ==0 else 'NO'
    case_exl.at[i,"执行日期"] = add_month(start_data,i)
print(type(case_exl))
case_exl.set_index("ID",inplace=True)
case_exl.to_excel('填充1.xlsx')
print(case_exl)

效果和 7的效果是一样的,写法只是for循环中的小区别

9.pandas 计算Excel后填充,源文件如下:最后售价 = 价格*折扣

pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_23

 

import pandas as pd
exl = pd.read_excel('计算.xlsx',index_col="ID")
exl['最后售价'] = exl.价格*exl.折扣
exl.to_excel('计算.xlsx')
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_24pandas玩Excel ---小白笔记1,感谢Timothy老师_数据_25

 

 

 

 10.上面的9是整体运算的,效率高,但是有时候需要按照行来计算,就可以这样写:

import pandas as pd
exl = pd.read_excel('计算.xlsx',index_col="ID")
for i in exl.index:
    exl.最后售价.at[i] = exl.价格.at[i]*exl.折扣.at[i]
print(exl)

  效果同9,可以修改循环次数,决定从那里开始和结束,效率没有9高,但是场景应该比9多

 11.计算某一列还可以调用函数,比如给价格涨5块钱

import pandas as pd
exl = pd.read_excel('计算.xlsx',index_col="ID")
def add_5(x):
return x+5
exl['价格'] = exl.价格.apply(add_5)
# exl.价格 = exl['价格'].apply(add_5)
# exl.价格 = exl['价格'].apply(lambda x:x+2)
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_26

 四.pandas对Excel排序,源文件:

排序使用sort_values函数,by是排序的列名,多个排序是传列表,ascending是正序和倒序,默认是从小到大,多个排序方式用列表传递

pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_27

 1.按照价格排序

import pandas as pd
exl = pd.read_excel('排序.xlsx',index_col="ID")
exl.sort_values(by='价格',inplace=True)
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_28

2.先按照贵不贵排序,在按照价格排序

import pandas as pd
exl = pd.read_excel('排序.xlsx',index_col="ID")
exl.sort_values(by=['贵不贵','价格'],inplace=True,ascending=[False,True])
print(exl)

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_源文件_29

 

  五.pandas对Excel数据赛选:

源数据:

pandas玩Excel ---小白笔记1,感谢Timothy老师_it技术_30

 

 1.看18-28岁 分数是85分以上的信息

# *_*coding:utf-8 *_*
# @Author : zyb
import pandas as pd
def age_18_to_28(a):
    return 18<=a<28
def fen_85(s):
    return 85<=s<100
exl = pd.read_excel('筛选.xlsx',index_col="ID")
# exl = exl.loc[exl.年龄.apply(age_18_to_28)].loc[exl.分数.apply(fen_85)]
exl = exl.loc[exl.年龄.apply(lambda a:18<=a<28)].loc[exl.分数.apply(lambda s:85<=s<100)]
print(exl)

 

  效果:

      pandas玩Excel ---小白笔记1,感谢Timothy老师_读取excel_31