Pandas

十二 EXCEL文件合并和拆分

12.1 一个文件夹下多个工作簿合并
import  pandas as pd
import os
root = 课件025/'

# data = pd.read_excel(root)
#准备一张空表

set = pd.DataFrame()

for i in os.listdir(root):

    sheet= pd.read_excel(root + i)

    set = pd.concat([set,sheet])

    print(set)

    # 写回去

    set.to_excel('')

先创建一个工作表  遍历跟目录下面的工作表  把工作表路径先拼接好,之后合并到一张工作表中
12.2 同一个工作簿中多个sheet合并
import  pandas as pd
import os
root = '合并2.xlsx'

data = pd.read_excel(root)

set = pd.DataFrame()
#把字段名全部拿出来放在name中
name = list(data.keys())

for i in name:
    
    #data[i] 是遍历 list中有的data.keys()  赋值给新的数据
     
    data1 =data[i]

    set = pd.concat([set,data1])

print(set)

创建工作表 data.keys() 找到字段 通过list(data.keys()) 拿到返回的列表

循环拿到的列表 创建新数据data1 = data[i]  最后再合并 空表和每次的新数据连接
12.3 将一个工作表拆分多个工作表

ExcelWriter() 可以向同一个excel的不同sheet中写入对应的表格,首先需要创建一个write对象,传入的主要参数为已存在容器表格的路径以及文件名称

excelWrite对已经设置好的格式是无法更改的,因此,有pandas转入excel的时候,必须先清除格式,尤其是表头

import pandas.io.formats.excel

pandas.io.formats.excel.header_style=None

标准的保存到pandas表到excel的形式为

writer = pd.ExcelWrite('C:/123.xlsx')

data.to_excel(writer,'工作表名') #这里假设df是一个pandas的dataframe

write.save()

write.close()

import  pandas as pd

root = '拆分.xlsx'

data = pd.read_excel(root)
#去重
slit = list(data['部门'].drop_duplicates())

root1 = pd.ExcelWriter('C:拆.xlsx')
# i 不同部门
for i in slit:
    data1 =data[data['部门']== i ]

    data1.to_excel(root1,sheet_name=i)
root1._save()

root1.close()

首先拿到一个去重的数据列表,ExcelWriter创建一个新的路径放生成的表
遍历这个列表 将拿到的不同的部门的数据data['部门']  赋值给一个新的数据
将拿到的新的数据重新写入到新创建的路径 ,表名 i 保存路径 关闭
12.4 将一个工作表拆分成多个工作簿
import  pandas as pd
    
    root = '拆分.xlsx'
    
    data = pd.read_excel(root)

    #去重  部门做一个列表
    slit = list(data['部门'].drop_duplicates())
    
    for i in slit:

        data1 = data[data['部门'] == i]
    
        data1.to_excel('c:/' + i + '.xlsx')

十三 分组聚合

13.1 分组集合groupby

groupby分为三个步骤 拆分 - 应用-合并

DataFrame可以在其行(axis=0)或者(axis=1) 上进行分组

然后,将一个函数应用到各个分组产生新值

最后,所有这些函数的执行结果会被合并到最终的结果对象中

Groupby的size方法可以返回一个含有分组大小的Series

|------------|-------------------|
| 函数名 | |
| count | 分组中非Nan值的数量 |
| sum | 非NA值的和 |
| mean | 非NA值的算术中位数 |
| std var | 无偏 分母为n-1 标准差 和方差 |
| min max | 非NA 值的最小值和最大值 |
| prod | 非NA值的积 |
| first last | 第一个最后一个非Na的值 |

agg函数一般与groupbu函数配合使用,agg是基于列的聚合操作,而groupby是基于行的

DataFrame.agg(func,axis=0,*args,**kwargs)

func():函数,函数名称,函数列表,字典{行名/列名,函数名}

使用特定轴上的一个或者多个操作进行聚合

import  pandas as pd

root = '6/分组聚合4.xlsx'
data = pd.read_excel(root,header=[0,1])

L1 = ['1季度','1季度','1季度','2季度','2季度']

L2 = ['1月','2月','3月','4月','5月']

set = pd.MultiIndex.from_arrays([L1,L2],names=['季度','月份'])

data2= pd.DataFrame(data,columns=set)

#axis=1列分组

data3 = data2.groupby(level='季度',axis=1).sum()

print(data3)
13.2分组对象和创建

isin()接收一个列表,判断列中元素是否存在列表中

isin()的逆函数 没有isnotin 它的反函数就是前面加上~ 例如 ~数据.班级.insin()

import  pandas as pd

root = 分组.xlsx'

data = pd.read_excel(root)

# data2 = data.groupby(data.index%2==0 )[['语文','数学','英语']].sum()

# data2 = data.groupby(data.姓名.str[0:3])[['语文','数学','英语']].sum()

data2 = data.groupby(data.班级.isin(['1班','2班']))[['语文','数学','英语']].sum()

print(data2)

班级分组
data2 = data.pipe(pd.DataFrame.groupby,'班级').sum()

十四 数据透视表

14.1 pivot_table

pd.pivot_table(index=['',''],values=['',''],columns=[''],aggfunc=[sum,np.mean])

Aggfunc聚合函数或者函数

index 需要聚合的列名

values 在结果透视的 行上 进行分组的列名

columns 在结果透视表的 列上 进行分组的列名

fill_value =0 缺失的值填充为0

dropna=True 不显示空列

margins 添加行/列和小计和总计

import  pandas as pd

import numpy as np

root = '透视.xlsx'
data = pd.read_excel(root)

data2 = pd.pivot_table(data,index=['部门','销售人员'],values=['数量','金额'],columns='所属区域',aggfunc=[len,sum,np.mean],fill_value=0,dropna=True)

print(data2)
14.2 crosstab
import  pandas as pd

import numpy as np

root = 透视.xlsx'
data = pd.read_excel(root)

data2 = pd.crosstab([data.日期.dt.month,data.所属区域],data.部门,margins=True)

结果
   日期  部门 销售人员 所属区域    数量  金额  成本
0    2019-01-01  销售  李平平   湖北    16   7   8
1    2019-01-02  销售  李平平   湖北    40   8   3
2    2019-01-03  销售  李平平   湖北    20   6   7
3    2019-01-04  销售  李平平   湖北    20   7   5
4    2019-01-05  销售  李平平   湖北    16   6   6
         ...  ..  ...  ...   ...  ..  ..
1215 2022-04-30  财务   熊牧   山东   250   4   8

十五 vlookup

15.1
import  pandas as pd

import numpy as np

root = 'Vlookup.xlsx'

data = pd.read_excel(root,sheet_name='花名册')

data1 = pd.read_excel(root,sheet_name='成绩单')

result = pd.merge(data,data1.loc[:,['学号','总分']],how='left',on='学号')

s = result.总分

result = result.drop('总分',axis=1)

result.insert(0,'总分',s)


print(result)

writer =pd.ExcelWriter(root)

result.to_excel(writer,idnex=False)

writer._save()

writer.close()

十六

16.1 map
import  pandas as pd
#
import numpy as np

root = '数据.xlsx'

data = pd.read_excel(root)

set = {'男':'先生','女':'女士'}

data['性别']=data['性别'].map(set)

print(data)


# def c(x,w):
#     return x+w
# data['语文'] = data['语文'].apply(c,args=(3,))
#
# print(data)


# set = {'男':'先生','女':'女士'}
#
# data['性别']=data['性别'].map(set)

# def  d(x):
#     name = '先生' if x == '男' else '女士'
#     return name
# data['称呼'] = data['性别'].map(d)
# print(data)

def BMI(data):
    h= data['身高']
    w = data['体重']
    BMI= h/w **2
    
    return  BMI

data['BMI'] = data['BMI'].apply(BMI,axis=1)
16.2同比 环比
import  pandas as pd
#
import numpy as np

root = '同比.xlsx'

data = pd.read_excel(root)

y = data['日期'].dt.year

data2 = pd.pivot_table(data,index='店号',values='金额',columns=y,aggfunc='sum')

data2['同比'] = (data2[2019]-data2[2018])/data2[2018]

print(data2)


#同比



# 环比
# def  d(x):
#    x['环比'] = x.金额 = x.金额.shift()
#    return  x
# data2 = data.sort_values(['城市','月份']).groupby('城市').apply(d)
#
# print(data2)
相关推荐
2401_857439691 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna1 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
梧桐树04292 小时前
python常用内建模块:collections
python
Dream_Snowar2 小时前
速通Python 第三节
开发语言·python
高山我梦口香糖3 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
信号处理学渣4 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客4 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
蓝天星空4 小时前
Python调用open ai接口
人工智能·python