安装:pip install openpyxl
打开工作簿 load_workbook(文件名)
获取工作表 workbook[sheet名称]
活动表,当前选中的表workbook.active
获取表格尺寸 sheet.dimensions
获取表格内某个格子的数据 sheet['A1']
获取一系列的单元格sheet['A1:A5'] sheet['A:C'] sheet['A'] sheet[5] sheet.rows获取所有的行 sheet.columns获取所有的列
按列获取 .iter_rows(min_row=最低行数,max_row=最高行数,min_col=最低列数,max_col=最低列数)
按行获取 .iter_cols(min_row=最低行数,max_row=最高行数,min_col=最低列数,max_col=最低列数)
获取行号
for col in cols:
print(str(col.row))
import openpyxl
#打开一个Excel表格
workbook=openpyxl.load_workbook('高一总成绩.xlsx')
#获取所有的sheet信息
print(workbook.sheetnames)
#workbook[sheet名称] 活动表,当前选中的表workbook.active
sheet=workbook['理科']
#sheet=workbook.active
#查看工作表尺寸
print(sheet.dimensions)
cells=sheet['B:C']
#元组类型要遍历
# print(cells)
# for cell in cells:
# #print(cell.value)#会报错((,)...) print(cells) 元组里面还有一个元组
# #print(cell[0].value)
# print(cell.value)
print(len(cells))#看大元组里面有几个小元组
for cell in cells: #一列是一个元组合起来是一个大元组,得到的是列
for ce in cell: #遍历这个列,输出单元格
print(ce.value) |
import openpyxl
workbook=openpyxl.load_workbook('高一总成绩.xlsx')
sheet=workbook['理科']
cols=sheet.iter_cols(min_row=1,max_row=6,min_col=2,max_col=10)
for col in cols:
for cell in col:
print(cell.value)
print('*'*30)
向某个格子写入内容 sheet['A1']='懒羊羊'
用某个格子写入内容 cell.value='懒羊羊'
使用Python列表数据插入一行 sheet. append(python列表) 一行内容
lst=['姓名','分数']
sheet.append(lst)
插入一列 .insert_cols(id=数字编号) 一列表格
插入多列 .insert_cols(id=数字编号,amount=要插入的列数)
col换成row就是插入行id=数字编号
插入公式 直接赋值公式字符串
from openpyxl.utils import FORMULAE
print(FORMULAE)#含有的Excel公式
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
stu_lst=[
['懒羊羊',20],
['喜羊羊',100]
]
for row in stu_lst:
sheet.append(row)
workbook.save('新表.xlsx')
import openpyxl
workbook=openpyxl.Workbook()#创建一个新的Excel文件
sheet=workbook.create_sheet()#创建一个工作表
sheet['A1']='懒羊羊'
workbook.save('新表.xlsx')
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
sheet['B5']='=sum(B3:B4)'
workbook.save('新表.xlsx')
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook["Sheet1"]
sheet.insert_cols(idx=1) #在第一列前插入
workbook.save('新表.xlsx')
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook["Sheet1"]
sheet.insert_cols(idx=2,amount=3) #在第二列之前插入三列
workbook.save('新表.xlsx')
删除列.delete_cols(idx=数字编号,amount=要删除的列数) (行 col改为row)
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook["Sheet1"]
sheet.delete_cols(idx=1,amount=3) #从第一列开始包括第一列,删除四列
workbook.save('新表.xlsx')
移动格子
sheet.move_range('A3:B8',row=3,col=-2) 正数是向下或右
#把A3到B8的数据看成一个整体,移动3行,2列
创建新的sheet
workbook.create_sheet(sheet名称)
删除一个sheet
workbook.remove(sheet名称)
复制一个sheet
workbook.copy_worksheet(sheet名称)
修改表格名称
sheet.title
import openpyxl
workbook=openpyxl.load_workbook('高一总成绩.xlsx')
print(workbook.sheetnames) #查看所有的sheet名称
workbook.create_sheet('羊村') #创建新的sheet
print(workbook.sheetnames)
#获取要删除的工作表的对象
sheet=workbook['羊村']
workbook.remove(sheet)#删除
#获取要复制的工作表的对象
sheet=workbook['文科']
workbook.copy_worksheet(sheet)#复制
#改名字
sheet=workbook['文科']
sheet.title='wenke'
print(workbook.sheetnames)
workbook.save('高一总成绩.xlsx')
冻结窗格sheet.freeze_panes='A2' 从第二行第一列开始冻结
import openpyxl
workbook=openpyxl.load_workbook('高一总成绩.xlsx')
sheet=workbook['理科']
sheet.freeze_panes='B2'
workbook.save('高一总成绩.xlsx')
添加筛选sheet.auto_filter.ref=sheet.dimensions
import openpyxl
workbook=openpyxl.load_workbook('高一总成绩.xlsx')
sheet=workbook['理科']
sheet.auto_filter.ref=sheet.dimensions #dimensions Excel表的一个范围
workbook.save('高一总成绩.xlsx')
调整字体与样式
Font(name=字体名称,size=字体大小,bold=是否加粗,italic=是否斜体,color=字体颜色)
获取表格中字体的样式 cell.font.属性
设置对齐样式Alignment(horizontal=水平对齐方式,vertical=垂直对齐方式,text_rotation=旋转角度,wrap_text是否换行)
import openpyxl
from openpyxl.styles import Font
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
sheet["A1"]='懒羊羊'
cell=sheet["A1"]
font=Font(name='微软雅黑',size=20,bold=True,italic=False,color='ff0000')#ff0000是红色
cell.font=font
workbook.save('新表.xlsx')
import openpyxl
from openpyxl.styles import Font
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
cell=sheet["A1"]
font=cell.font
print(font.name)
import openpyxl
from openpyxl.styles import Alignment
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
cell=sheet["A1"]
algin=Alignment(horizontal='center',vertical='center')
cell.alignment=algin
workbook.save('新表.xlsx')
设置边框样式
Side(style=边线样式,color=边线颜色)
Border(left=左边线样式,right=右边线样式,top=上边线样式,bottom=下边线样式)
import openpyxl
from openpyxl.styles import Side,Border
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
cell=sheet["A1"]
side=Side(style='thin',color='ff0000')#设置线条的形状和颜色
border=Border(left=side,right=side,top=side,bottom=side)
cell.border=border
workbook.save('新表.xlsx')
设置填充样式
PatternFill(fill_type=填充样式,fgColor=填充颜色)
GradientFill(stop=(渐变色1,渐变色2,,...))
import openpyxl
from openpyxl.styles import PatternFill,GradientFill
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
#纯色
cell=sheet["B2"]
pattern_fill=PatternFill(fill_type='solid',fgColor='ffff00')
cell.fill=pattern_fill
#渐变色
cell=sheet["D2"]
grad=GradientFill(stop=('ff00ff','00ff00'))
cell.fill=grad
workbook.save('新表.xlsx')
设置行高和列宽
.row_dimensions[行编号].height=行高
.column_dimensions[列编号].width=列宽 列的编号ABCD
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
sheet.row_dimensions[2].height=50
sheet.column_dimensions['B'].width=50
workbook.save('新表.xlsx')
合并单元格
.merge_cells(待合并的格子编号)
.merge_cells(start_row=起始行号,start_column=起始列号,end_row=结束行号,end_column=结束列号)
取消合并单元格 .unmerge_cells(...和上面的一样...),前面加个un就行了
import openpyxl
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook['Sheet1']
#sheet.merge_cells(start_row=4,start_column=4,end_row=6,end_column=6)
sheet.merge_cells("D1:G2")
workbook.save("新表.xlsx")
输入pip install Pillow显示需要更新,按照指令python -m pip install --upgrade pip进行更新
#这个要先看看,Pillow更新没
插入图片 openpyxl.drawing.image
sheet.add_image
import openpyxl
from openpyxl.drawing.image import Image
workbook=openpyxl.load_workbook('新表.xlsx')
sheet=workbook.create_sheet('imagesheet')
#创建图片对象
bizhi=Image('壁纸.png')
bizhi.height=1200
bizhi.width=1920
sheet.add_image(bizhi,'A1')
workbook.save("新表.xlsx")
插入柱状图
BarChart() Reference——范围
from openpyxl.chart import BarChart,Reference
workbook=openpyxl.load_workbook('柱状图和条形图.xlsx')
sheet=workbook['多列数据的柱状图']
#创建柱状图的图表对象
chart=BarChart()
#数据的引用范围-图表数据
data=Reference(worksheet=sheet,min_row=1,max_row=5,min_col=1,max_col=2)
#类别的应用范围-表名称
categories=Reference(sheet,min_row=2,max_row=5,min_col=1,max_col=1)
#将数据与类别添加到图表中
chart.add_data(data,titles_from_data=True)
chart.set_categories(categories)
#将图表插入工作表中
sheet.add_chart(chart,'F12')
workbook.save("柱状图和条形图.xlsx")
条形图
LinChart()
chart.add_data(data,from_rows=True,titles_from_data=True)
练习
import openpyxl
import datetime
#设置字体,对齐方式,边框的样式,边框
from openpyxl.styles import Font,Side,Border,Alignment
#设置字体样式
font1=Font(name='宋体',size=20,bold=True,color='ff0000')
font2=Font(name='宋体',size=20,bold=True)
font3=Font(name='宋体',size=14,bold=False)
font4=Font(name='Times New Roman',size=12,bold=False)
#设置对齐方式
alignment=Alignment(horizontal='center',vertical='center',wrap_text=True)
#设置线性
side=Side(style='thick',color='000000')
#边框
border=Border(left=side,right=side,top=side,bottom=side)
#选择需要缩进的代码块
'''
Tab :集体向右缩进
Shift + Tab :集体向左回缩
'''
#加载Excel文件
workbook=openpyxl.load_workbook(r'C:\Users\hff\Desktop\大班.xlsx')
#指定工作表
sheet=workbook['Sheet1']
#获取指定单元格的值
a1_value=sheet['A1'].value
h2_value=datetime.date(2021, 12, 20)
#print(h2_value)
#获取指定行
rows=sheet[3]
lst_value=[]
#遍历元组得到每一个单元格
for cell in rows:
lst_value.append(cell.value) #获取第三行的值
#将表头部分写入新的Excel文件中
for i in range(4,34):
#标题
write_workbook=openpyxl.Workbook()#创建Excel
write_sheet=write_workbook.active#获取当前活动的表
#合并单元格
write_sheet.merge_cells(start_row=1,end_row=1,start_column=1,end_column=10)
write_sheet.merge_cells(start_row=2,end_row=2,start_column=8,end_column=10)
#设置行高
write_sheet.row_dimensions[1].height=25
write_sheet['A1']=a1_value
write_sheet["A1"].font=font2
write_sheet["A1"].alignment=alignment
#第二行
write_sheet['H2']=h2_value
write_sheet["H2"].font=font4
write_sheet["H2"].alignment=alignment
#第三行
write_sheet.append(lst_value)
three_rows=write_sheet[3]
for cell in three_rows:
cell.font=font3
cell.alignment = alignment
cell.border=border
write_sheet.row_dimensions[3].height=20
#设置列宽
thr_rows=write_sheet[3]
for col in thr_rows:
#print(col.column_letter)#获取列的字母
write_sheet.column_dimensions[col.column_letter].width=10
#添加数据
write_sheet["A4"].value=sheet['A'+str(i)].value
write_sheet["B4"].value=sheet['B'+str(i)].value
write_sheet["C4"].value=sheet['C'+str(i)].value
write_sheet["D4"].value=sheet['D'+str(i)].value
write_sheet["E4"].value=sheet['E'+str(i)].value
write_sheet["F4"].value=sheet['F'+str(i)].value
write_sheet["G4"].value=sheet['G'+str(i)].value
write_sheet["H4"].value=sheet['H'+str(i)].value
write_sheet["I4"].value=sheet['I'+str(i)].value
write_sheet["J4"].value='=SUM(D4:I4)'
#居中
for_row=write_sheet[4]
for cell in for_row:
cell.alignment=alignment
cell.border=border
#保存
write_workbook.save('C:\\Users\\hff\\Desktop\\成绩单\\'+str(write_sheet["C4"].value)+write_sheet["B4"].value+'.xlsx')
#报错的话,先卸载xlrd,安装低版本的pip install xlrd==1.2.0
创建Excel
import pandas as pd
df=pd.DataFrame({'Id':[1,2,3],'name':['懒羊羊','喜羊羊','沸羊羊']})#创建Excel
df=df.set_index('Id')#把ID设置为索引
print(df)
df.to_excel(r'C:\Users\hff\Desktop\实验.xlsx')#保存Excel
读取exccel
import pandas as pd
fenshu=pd.read_excel('分数.xlsx')
#表格大小
print(fenshu.shape)
#列名
print(fenshu.columns)
#看看文件的前几行,默认前五行
print(fenshu.head(3))#看前三行
print(fenshu.tail(3))#看末尾三行,列名是不消失的
#Excel表里面有废弃的第一行(有无用的数字)
import pandas as pd
print(fenshu.columns)
fenshu=pd.read_excel('分数.xlsx',header=1)#header默认是0对应Excel第一行
print(fenshu.columns)
------------------------------------------------------------------
##Excel表里面有空白的第一行
print(fenshu.columns) #能正确识别列名,自动把空行跳过去了
#没有列名
import pandas as pd
print(fenshu.columns)
fenshu=pd.read_excel('分数.xlsx',header=None)
print(fenshu.columns)#自动生成整数从0开始
fenshu.columns=['学号','姓名','总分']#添加列名
fenshu.set_index('学号',inplace=True)
fenshu=fenshu.set_index('学号')#和上面的一样
fenshu=pd.read_excel('分数.xlsx',index_col='学号')
index和columns是分开对待的
行,列,单元格
import pandas as pd
d={'x':100,"y":200,"z":300}
print(d.keys())
print(d.values())
print(d['x'])
s1=pd.Series(d) #x,y,z转成index
print(s1)
print(s1.index)
#print(s1.data)#已经不用了
fenshu=[90,80,20]
name=['喜羊羊','沸羊羊','懒羊羊']
s2=pd.Series(fenshu,index=name)
print(s2)
import pandas as pd
s1=pd.Series([10,20,28],index=['数学','语文','体育'],name='懒羊羊')
s2=pd.Series([60,60,100],index=['数学','语文','体育'],name='沸羊羊')
s3=pd.Series([100,100,100],index=['数学','语文','体育'],name='喜羊羊')
df=pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3})
print(df)
懒羊羊 沸羊羊 喜羊羊
数学 10 60 100
语文 20 60 100
体育 28 100 100
df=pd.DataFrame([s1,s2,s3])#用列表,index是在一行
print(df)
数学 语文 体育
懒羊羊 10 20 28
沸羊羊 60 60 100
喜羊羊 100 100 100
进程已结束,退出代码 0
自动填充
import pandas as pd
from datetime import date,timedelta
books=pd.read_excel('分数.xlsx',skiprows=3,usecols="A,B,C",index_col=None,dtype={'ID':str,'分数':str,'日期':str})
#跳过前面的三行和A,B,C三列 , 'A:C'也行,dtype=['ID':str]把ID换成整数,写int它不会让你把nan转成int类型
start=date(2021,1,1)
for i in books.index:
books['ID'].at[i]=i+1
books['分数'].at[i]='yes'if i%2==0 else 'no'
books['日期'].at[i]=start
print(books)
import pandas as pd
from datetime import date, timedelta
def add_month(d, md)
yd = md // 12
m = d.month + md % 12
if m != 12:
yd += m // 12
m = m % 12
return data(d.year + yd, m, d.day)
books = pd.read_excel('分数.xlsx', skiprows=3, usecols="A,B,C", index_col=None, dtype={'ID': str, '分数': str, '日期': str})
# 跳过前面的三行和A,B,C三列 , 'A:C'也行,dtype=['ID':str]把ID换成整数,写int它不会让你把nan转成int类型
start = date(2021, 1, 1)
for i in books.index:
books['ID'].at[i] = i + 1
books['分数'].at[i] = 'yes' if i % 2 == 0 else 'no'
books['日期'].at[i] = start + timedelta[days = i] # 加天
books['日期'].at[i] = data[start.year + i, start.month, start.day] # 加年
print(books)
books.set_index('ID', inplace=True)
books.to_excel('xxx.xlsx')
函数填充,计算列
import pandas as pd
books=pd.read_excel('文件.xlsx',index_col='ID')
books['结果列']=books['乘数列1']*books['乘数列2']
books['结果列']=books['乘数列1']*0.36
print(books)
-------------------------------------------------
for i in books.index:
books['结果列']=books['乘数列1'].at[i]*books['乘数列2'].at[i]#单元格相乘
-------------------------------------------------
def add_2(x):
return x+2
books['数列1']=books['数列1'].apply(add_2)#结果+2
排序
import pandas as pd
fenshu=pd.read_excel('分数.xlsx',index_col='ID')
fenshu.sort_values(by="总分",inplace=True,ascending=True)#替换当前表,从小到大排序
print()
#先排总分,再排语文
fenshu.sort_values(by=["总分",'语文'],inplace=True,ascending=[True,Flase])
数据的筛选和过滤
import pandas as pd
def yuwen_fenshu_0_to_60(a):
return a>=0and a<60
def shuxue_fenshu_80_to_100(a):
return a>=80and a<=100
students=pd.read_excel('C:\\Users\\hff\\Desktop\\大班.xlsx',skiprows=2)
#报错的话,先卸载xlrd,安装低版本的pip install xlrd==1.2.0
students=students.loc[students['语文'].apply(yuwen_fenshu_0_to_60)].loc[students['数学'].apply(shuxue_fenshu_80_to_100)]
print(students)
数据可视化
单柱状图
import pandas as pd
import matplotlib.pyplot as plt
students=pd.read_excel('C:\\Users\\hff\\Desktop\\大班.xlsx',skiprows=2)
# students.plot.bar(x='姓名',y='数学',color='orange',title='数学成绩')
plt.bar(students.姓名,students.数学)
plt.xticks(students.姓名,rotation='90')
plt.xlabel('姓名')
plt.ylabel('数学')
plt.title('数学分数',fontsize=16)
#汉字显示乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()#展示图
plt.tight_layout()#紧凑型布局
多柱状图
import pandas as pd
import matplotlib.pyplot as plt
students=pd.read_excel('C:\\Users\\hff\\Desktop\\大班.xlsx',skiprows=2)
students.plot.bar(x='姓名',y=['数学','语文'],color=['orange','red'],title='数学成绩')
plt.xlabel('姓名',fontweight='bold')
plt.title('数学分数',fontsize=16)
ax=plt.gca()#拿到轴
ax.set_xticklabels(students['姓名'],rotation=45,ha='right')#默认旋转是按着文字的中心旋转,ha='right'按右边对齐
f=plt.gcf()#拿到图
f.subplots_adjust(left=0.2,bottom=0.42)#调整布局
#汉字显示乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()#展示图
students.plot.bar(x='姓名',y=['数学','语文'],stacked=True,color=['orange','red'],title='数学成绩') 旋转students.plot.barh(x='姓名',y=['数学','语文'],stacked=True,color=['orange','red'],title='数学成绩')
饼图
students.分数 ——汉字可以 ,数字就不行
import pandas as pd
import matplotlib.pyplot as plt
students=pd.read_excel('C:\\Users\\hff\\Desktop\\饼图.xlsx',index_col='时间')
students['2017'].sort_values(ascending=True).plot.pie(fontsize=18,startangle=90)
#startangle从那开始
#students['2017'].sort_values(ascending=True).plot.pie(fontsize=18,counterclock=Flase)
#counterclock顺时针
#汉字显示乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()#展示图
日期要改成字符
折线图
index_col='日期'
students.plot(y=['花费','收入'])
叠加区域图
students.plot.area(y=['花费','收入'])
散点图
pandas.options.diplay.max_columns=777 #显示所有列
students.plot.scatter(x='身高',y='体重')
分布图
import pandas as pd
import matplotlib.pyplot as plt
students=pd.read_excel('C:\\Users\\hff\\Desktop\\散点图.xlsx')
students.体重.plot.hist(bins=50)#50个桶(组)
plt.xticks(range(30,int(max(students.体重)),2),fontsize=8,rotation=90)
#汉字显示乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()#展示图
学生体重为70千克有0.2%的可能性
import pandas as pd
import matplotlib.pyplot as plt
students=pd.read_excel('C:\\Users\\hff\\Desktop\\散点图.xlsx')
# students.体重.plot.hist(bins=50)#50个桶(组)
# plt.xticks(range(30,int(max(students.体重)),2),fontsize=8,rotation=90)
students.体重.plot.kde()
plt.xticks(range(30,int(max(students.体重)),2),fontsize=8,rotation=90)
#汉字显示乱码问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.show()#展示图
print(students.corr())#相关性
多表联合
excel
VLOOKUP(要填的地方,选择区域,选择要填的东西,false) false不用临近点插值
IFNA(NA,0) ,NA的话用0来顶替
python
import pandas as pd
students=pd.read_excel('文件1.xlsx',sheet_name='sheet1')
scores=pd.read_excel('文件1.xlsx',sheet_name='sheet2')
table=students.merge(scores,how='left',left_on='ID',rihght_on='ID').fillna(0)
table.Score=table.Score.astype(int)#转换为整数
#how='left'不管条件成立不成立,左边表的数据都要保存
print(table)
import pandas as pd
students=pd.read_excel('文件1.xlsx',sheet_name='sheet1',index_col='ID')
scores=pd.read_excel('文件1.xlsx',sheet_name='sheet2',index_col='ID')
table=students.join(scores,how='left',on='ID').fillna(0)
table.Score=table.Score.astype(int)#转换为整数
#how='left'不管条件成立不成立,左边表的数据都要保存
print(table)
数据校验
数据,数据有效性
import pandas as pd
def score_validation(row):
if not 0<=row.Score<=100:
print(f'#{row.ID}\t{row.Name}是无效的分数{row.Score}.')
student=pd.read_excel('文件.xlsx')
students.apply(score_validation,axis=1)#axis 0表示列,1表示行
数据分裂
import pandas as pd
employees=pd.read_excel('文件.xlsx',index_col="ID")
df = employees['FULL NAME'].str.split(' ',n=2,expand=True)
employees['FULL NAME']=df[0]
employees['FULL NAME']=df[1].str.upper()
print(employees)
求和
import pandas as pd
student=pd.read_excel('文件.xlsx')
temp=students[['语文'],['数学']]
result=temp.sum(axis=1)
row_mean=temp.mean(axis=1)
students['Total']=result
students['AVERAGR']=row_mean
col_man=students[['语文'],['数学']].mean()
col_mean['name']='Summary'
students=students.append(col_man,ignore_index=True)
消除重复项
students.drop_duplicates(subset=['id','name'],inpalce=True,keep='last')
找到重复数据
dupe = students.duplicated(subset='Name')
print(dupe.any()) #查看里面有没有True
dupe = students.duplicated(subset='Name')
dupe =dupe[dupe == True]
print(dupe)
print(students.iloc[dupe.index])
旋转
复制,粘贴,就可以旋转
table= students.transpose()
pd.options.display.max_columns=111#显示111行
数据透视表
import pandas