目录

创建新的工作簿

新建工作簿同时写入数据

设置索引

读取数据

txt和CSV文件转化

读取数据库内容

pandas数据结构

DataFrame用法

实现VLOOKUP功能

需求:将总分调整顺序,放在第一列??

需求:将性别这一列数据  “男”全部改为先生,“女”全部改为女士

需求:姓名字段在表1是列,在表2是索引,如何进行连接合并?

需求:网站导出数据时,数据过大分表导出,想将导出的表合并成一张表,表字段相同

知识点:Pandas如何遍历一列数据? data.at[0, 'a']

需求:pandas删除表格一行或一列,多行或多列?

Pandas轴的理解

判断所有的空值

需求:删除所有含空值的行/列

需求:一行或一列全部为空时进行删除

需求:删除语文,数学这二列包含空值的行

需求:每一行/列空值个数不能超过二个

需求:所有的空值进行填充某一个值,或按列进行区分

需求:空值按前后元素进行填充

Pandas数学统计函数

Pandas删除重复和提取重复

算数运算与数据对齐

多层索引


创建新的工作簿

import pandas as pdfile_path = r"C:\Users\YGJ ing7\Desktop\pandas.xlsx"
data = pd.DataFrame()
data.to_excel(file_path)
print("make a new file!")

新建工作簿同时写入数据

data = pd.DataFrame({'id':[1, 2, 3], "name": ['关羽', '刘备', '张飞']})
print(data)
--------结果--------id name
0   1   关羽
1   2   刘备
2   3   张飞

设置索引

data.set_index('id')

读取数据

import pandas as pdfile_path = r"C:\Users\admin\Desktop\1.xlsx"
data = pd.read_excel(file_path)
# 取一行数据
print(data.head(1))
# 查看数据的形状,返回(行数、列数)
print(data.shape)
# 查看列名列表
print(data.columns)
# 查看索引列
print(data.index)
# 查看每一列数据类型
print(data.dtypes)

知识点1: 几个重要的参数skiprow, 跳过开头的几行,,usecols只读取c,e二列 【C:F是c-f列】

df = pd.read_excel(file_path, skiprows=4, usecols="C, E")
  • skiprow, 跳过开头的几行
  • usecols只读取c,e二列 【C:F是c-f列】
  • dtype={"身份证号":"str",“手机号”: “str”}放在读出来的数据科学计数法表示

知识点2:只想要一些数据:head(num) 想要几行写几行;

知识点3:reas_csv() 默认逗号分隔,read_table()  添加参数sep='\s+' 匹配\t \n \r等 导入re库;

知识点4:读取文件表头设置 headers=None, names=[] 配合使用

data = pd.read_csv(file_path, header=None, names=['性别', '姓名', '年龄', '手机号', '住址', '入职日期'], nrows=3)

txt和CSV文件转化

读取TXT文件,在写入csv文件

import pandas as pdfile_path = r"C:\Users\admin\Desktop\1.txt"
data = pd.read_csv(file_path, header=None, names=['性别', '姓名', '年龄', '手机号', '住址', '入职日期'])
data.to_csv(r"C:\Users\admin\Desktop\1.csv", encoding='gbk')

读取数据库内容

import pandas as pd
import pymysqldb = pymysql.connect(host="127.0.0.1", user="root", password="12**56", database="task01", charset="utf8", port=3306)
data = pd.read_sql('select * from table_a', con=db, )
print(data)

pandas数据结构

Series序列,一维数组表示一行或一列数据

import pandas as pddata = pd.Series(['loa', 'jia', 'iqo', 'kms', 'neh', 'ncjx', 'mkd'])
print(data)
print(data.index)
print(data.values)

DataFrame用法

1,传入二维列表格式,columns表示列字段, 执行如下代码:

import pandas as pd
data=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['a','b','c'])
--------结果--------a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

2, 传入的字典格式数据,

data = pd.DataFrame({'id':[1, 2, 3], "name": ['关羽', '刘备', '张飞']})
print(data)
--------结果--------id name
0   1   关羽
1   2   刘备
2   3   张飞

3, DataFrame结构,如何取数据??

print(data['a'][0] )      # 先列后行
print(data.loc[1]['a'] )  # 先行后列
print(data.iloc[1][0] )   # 数字形式 行-列
print(data[['a','b']])    # 取2列数据
--------结果-------
1
4
4a  b
0  1  2
1  4  5
2  7  8

实现VLOOKUP功能

第一个表字段通过学号进行匹配,添加一列总分字段

# -*- coding: utf-8 -*-
import pandas as pddf_sinfo = pd.read_excel(r"C:\Users\admin\Desktop\Vlookup.xlsx", sheet_name="花名册")
print(df_sinfo.head())
df_grade = pd.read_excel(r"C:\Users\admin\Desktop\Vlookup.xlsx", sheet_name="成绩单")
print(df_grade.head())res = pd.merge(df_sinfo, df_grade.loc[:, ["学号", "总分"]], how="left", on="学号")
print(res)---------------------------结果----------------------------学号  姓名  班级
0   1  张三  1班
1   2  李四  1班
2   3  王五  2班
3   4  赵六  2班
4   5  邓七  3班学号  语文  数学  英语   总分
0   1    67    77    63    207
1   2    81    58    65    204
2   3    89    60    58    207
3   4    67    61    52    180
4   5    78    55    51    184学号  姓名  班级   总分
0   1  张三    1班    207
1   2  李四    1班    204
2   3  王五    2班    207
3   4  赵六    2班    180
4   5  邓七    3班    184

需求:将总分调整顺序,放在第一列??

实现思路:

  • 复制结果表中的总分列
  • 将结果表中的总分列删除    res.drop("总分", axis=1)
  • 插入复制的总分列
total = res["总分"]
res = res.drop("总分", axis=1)
res.insert(0, "总分", total)
print(res)
---------------------------结果----------------------------总分  学号  姓名  班级
0   207   1   张三   1班
1   204   2   李四   1班
2   207   3   王五   2班
3   180   4   赵六   2班
4   184   5   邓七   3班

需求:将性别这一列数据  “男”全部改为先生,“女”全部改为女士

解决思路:利用pandas中的map映射方法

第一种方式:字典映射

import pandas as pdfile_path = r"C:\Users\admin\Desktop\数据.xlsx"
df = pd.read_excel(file_path)
dict_map = {"男": "先生", "女": "女士"}
# df["称呼"] = df["性别"].map(dict_map)
df["性别"] = df["性别"].map(dict_map)
print(df)

首先创建一个映射:字典格式

性别字段.map(映射)在赋值给该列,如果想创建一个新的列“称呼”就赋值给新的列

第二种方式:函数映射

map()中也可以传入一个函数

def replace_map(x):if "男" == x:res = "先生"else:res = "女士"return resdf["称呼"] = df["性别"].map(replace_map)
print(df)

需求:姓名字段在表1是列,在表2是索引,如何进行连接合并?

   

解决:使用左表的姓名列,右表的索引列进行连接【left_on='姓名', right_index=True】右图连接效果

import pandas as pddata1 = pd.DataFrame({"姓名": ["张三", "李四", "王五", "赵六"], "次数": range(4)})
data2 = pd.DataFrame({"数据": [10, 20]}, index=["张三", "李四"])
print(data1)
print(data2)
data = pd.merge(data1, data2, left_on="姓名", right_index=True, how='inner')
print(data)

连接方式:how="inner", "outer", "left", "right"

以下内容引用UP主笔记内容:S02E08.连接查询之join与Merge总结_哔哩哔哩_bilibili


没有指定how的话默认使用inner方法,除了内连接,还包括左连接、右连接、全外连接

左连接:

 result = pd.merge(left, right, how='left', on=['key1', 'key2'])

右连接:

result = pd.merge(left, right, how='right', on=['key1', 'key2'])

全外连接:

result = pd.merge(left, right, how='outer', on=['key1', 'key2'])

2)suffix后缀参数

如果表合并的过程中遇到有一列两个表都同名,但是值不同,合并的时候又都想保留下来,就可以用suffixes给每个表的重复列名增加后缀。

result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])


需求:网站导出数据时,数据过大分表导出,想将导出的表合并成一张表,表字段相同

解决:使用pandas的concat()函数进行多表的合并。

  • 首先分别读取多个excel文件,将dataframe追加至列表中
  • 使用pd.concat()函数,参数传入刚才的列表进行连接
  • 将连接的表格进行写入文件
table_list = []
table1 = pd.read_excel(r"C:\Users\admin\Desktop\table1.xls", dtype={"订单编号":"str", "退款编号":"str", "商品编码":"str"})
table2 = pd.read_excel(r"C:\Users\admin\Desktop\table2.xls", dtype={"订单编号":"str", "退款编号":"str", "商品编码":"str"})
table3 = pd.read_excel(r"C:\Users\admin\Desktop\table3.xls", dtype={"订单编号":"str", "退款编号":"str", "商品编码":"str"})
table_list.append(table1)
table_list.append(table2)
table_list.append(table3)
table = pd.concat(table_list)
table.to_excel(r"C:\Users\admin\Desktop\table.xls", index=False)

注意:由于订单编号等需要默认数字形式会以科学计数法显示,将这些列读取时按照字符串进行读取即可

知识点:Pandas如何遍历一列数据? data.at[0, 'a']

for i in data.index:data["序号"].at[i]

需求:pandas删除表格一行或一列,多行或多列?

解决:使用pandas的drop函数进行表格的删除操作

import pandas as pdfile_path = r"C:\Users\YGJ ing7\Desktop\Pandas课件\pandas教程\课件015-016\删除.xlsx"
df = pd.read_excel(file_path, index_col="序号")
print(df)# 删除第二行,并不会修改原来的df, 需要在原数据更改:inplace=True
print(df.drop(2))
# 删除多行
print(df.drop(labels=[1, 2]))# 删除语文列,并不会修改原来的df
print(df.drop("语文", axis=1))
# 删除多列
print(df.drop(labels=["语文", "英语"], axis=1))
  • 删除一行直接在:drop()后跟参数第几行
  • 删除多行使用参数:labels=[], 接受列表类型参数
  • 删除列使用参数:axis=1,一轴表示列,默认0表示行操作

Pandas轴的理解

判断所有的空值

# 判断所有的空值
print(df.isnull())
print(df.notnull())

需求:删除所有含空值的行/列

# 删除含有空值的行, 非原数据操作inplace=False: 默认的
print(df.dropna())
# 删除含有空值的列, 非原数据操作inplace=False: 默认的
print(df.dropna(axis=1))

需求:一行或一列全部为空时进行删除

# 当一行或一列全部为空时候进行删除
print(df.dropna(how="all"))
print(df.dropna(how="all", axis=1))

需求:删除语文,数学这二列包含空值的行

# 删除语文,数学这二列中包含空值的行/列
print(df.dropna(subset=["语文", "数学"]))

需求:每一行/列空值个数不能超过二个

# 每一行/列 中非空值的个数不能超过2个
print(df.dropna(thresh=2))
print(df.dropna(thresh=2, axis=1))

需求:所有的空值进行填充某一个值,或按列进行区分

# 所有的空值填充某一个值
print(df.fillna(60))
# 语文空值默认20, 数学空值默认30, 英语空值默认10
print(df.fillna({"语文": 20, "数学": 30, "英语": 10}))

需求:空值按前后元素进行填充

# 将空值按该空值的上一行进行填充
print(df2.fillna(method='ffill', axis=0))
# 将空值按该空值的下一行进行填充
print(df2.fillna(method='bfill', axis=0))

Pandas数学统计函数

# 数据列的数学统计:最大最小值,数量,平均值,标准值
print(df.describe())print(df["语文"].max())
print(df["语文"].mean())

pandas统计函数汇总:使用方法如上

Pandas删除重复和提取重复

# 数据列【姓名】的去重--返回姓名去重的列表
print(df2["姓名"].unique())
# 数据列【姓名】的去重--返回姓名去重的索引+姓名
print(df2["姓名"].drop_duplicates())
# 统计相同【姓名】出现的次数
print(df2["姓名"].value_counts())
  • unique()函数是类似于set,返回一个数值不重复的列表
  • drop_duplicates()函数会删除重复的行数据
  • value_counts() 统计值出现的次数
# 姓名重复的那一行删除,保留第一次出现的数据
print(df2.drop_duplicates(subset=["姓名"], keep="first"))
# 姓名重复的那一行删除,保留最后一次出现的数据
print(df2.drop_duplicates(subset=["姓名"], keep="last"))
# 提取姓名没有重复的数据
print(df2.drop_duplicates(subset=["姓名"], keep=False))
# 提取姓名重复的数据
is_duplicates = df2.duplicated(subset=["姓名"])
print(df2[is_duplicates])
  • drop_duplicates()函数一些重要的参数:
  • subset=["姓名", "班级"] 处理多列数据
  • keep = "first"【保留第一次出现的值】
  • keep = "last" 【保留最后一次出现的值】
  • keep = False 【不保留重复的值,就是删除所有重复的数据】

算数运算与数据对齐

1,空值填充为0:使用filena()函数进行填充

df.fillna(0, inplace=True)
res = df["1店"] + df["2店"]
print(res)

2,正负无穷大转化为NaN: 需要在脚本开头添加一句

# 将无穷大转变为NaN
pd.options.mode.use_inf_as_na = True
res2 = df2["1店"].div(df2["2店"], fill_value=0)
print(res2.fillna(0))

多层索引

1, 设置分层索引

设置分层索引前:                                                           设置分层索引后

                                      

# df = pd.read_excel(file_path, sheet_name="有序")
df = pd.read_excel(file_path, sheet_name="有序", index_col=[0, 1])
print(df)
  • 多行索引:header=[0, 1]
  • 多列索引:index_col=[0, 1]

2, 多层索引查看值,例如查看1班所有的值

# 查看一班所有的信息
data = df.loc[(("1班"), slice(None)), :]
print(data)
  • slice(None)作用等同于【:】   表示所有的行,但是不能换用

索引无序时,上面方法获取可能会报错,查看索引是否有序?df2.index.is_lexsorted()

file_path2 = r"C:\Users\admin\Desktop\pandas教程\课件020\多层索引.xlsx"
df2 = pd.read_excel(file_path2, sheet_name="无序", index_col=[0, 1])
print(df2.index.is_lexsorted())

无序索引查询之前先进行排序处理

df2.sort_index(level="科目")
print(df2.loc[("语文", slice(None)), :])

分组聚合groupby

情形1:按照城市和区进行人数 / 金额 分组求和 

解决思路:

  • groupby()函数的基本使用
  • 按照城市、区进行分组:参数列表形式
  • 分组完成后取[["人数"]]当然可以添加金额字段
  • 求和使用.sum()函数
import pandas as pdfile_path = r"C:\Users\admin\Desktop\pandas教程\课件026\分组聚合.xlsx"
df = pd.read_excel(file_path)
res = df.groupby(["城市", "区"])[["人数"]].sum()
res.to_excel(r"C:\Users\admin\Desktop\聚合.xlsx")
print(res)

情形2:店铺营销额分析,按照季度进行分组求和

解决思路:

  • groupby()函数的基本应用
  • 创建一个月份和季度的对应关系 month_to_quarter
  • 使用分组聚合函数进行分组,axis=1表示处理列
  • 求和使用.sum()函数
import pandas as pdfile_path = r"C:\Users\admin\Desktop\pandas教程\课件026\分组聚合2.xlsx"
df = pd.read_excel(file_path, index_col="店号")
month_to_quarter= {"1月": "一季度", "2月": "一季度", "3月": "一季度", "4月": "二季度", "5月": "二季度", "6月": "二季度", "7月": "三季度", "8月": "三季度", "9月": "三季度", "10月": "四季度", "11月": "四季度", "12月": "四季度"}
res = df.groupby(month_to_quarter, axis=1).sum()
res.to_excel(r"C:\Users\admin\Desktop\合并2.xlsx")

数据筛选

需求1:筛选出序号2-6的行数据, 取姓名,性别,地址这三列的数据

  • 就是取序号为2,3,4,5,6的行数据,使用loc[]进行取值
# 取2,3,4,5,6行的数据
df.loc[2:6]
  • 取列数据使用列表形式:["姓名", "性别", "地址"]
df[["姓名", "性别", "地址"]]

需求2:【单条件】选择性别为“男” 的全部数据

  • 涉及pandas的条件筛选,首先是创建一个条件变量is_male【布尔类型】
  • 将布尔类型变量传入df
# 选择性别为男的数据
is_male = df["性别"] == "男"
df[is_male]

需求3:【多条件】选择性别为“男”并且总分大于150的数据

  • 多条件筛选也类似单条件筛选,is_mm【字符串类型】
  • 使用.query()进行筛选
is_mm = "性别 == '男' and 总分 >= 150"
df.query(is_mm)

需求4:【模糊查询】选择姓名“王”开头的数据

  • 条件变量is_startswith,字符串开头函数startswith,df["姓名"].str.startswith('王')
  • 选择df[is_startswith]
is_startswith = df["姓名"].str.startswith("王")
res = df[is_startswith]
  • 开头函数:startswith()
  • 结尾函数:endswith()
  • 包含函数:contains()

Python之pandas库--基础相关推荐

  1. Python 数据分析与展示笔记4 -- Pandas 库基础

    Python 数据分析与展示笔记4 – Pandas 库基础 Python 数据分析与展示系列笔记是笔者学习.实践Python 数据分析与展示的相关笔记 课程链接: Python 数据分析与展示 参考 ...

  2. 学习 Python 之 Pandas库

    学习 Python 之 Pandas库 Pandas库 什么是Pandas库? DataFrame 创建和存储 1. 使用DataFrame构造函数 (1). 使用列表创建 (2). 使用字典创建 ( ...

  3. 数据分析一、 pandas库基础知识

    pandas库基础知识 一.jupyter 代码编辑器 概述:Python 数据分析库介绍 二.pandas 库基础知识 (1)常用的Series属性与方法: (2) DataFrame常用方法 1. ...

  4. Py之Pandas:Python的pandas库简介、安装、使用方法详细攻略

    Py之Pandas:Python的pandas库简介.安装.使用方法详细攻略 目录 pandas库简介 pandas库安装 pandas库使用方法 1.函数使用方法 2.使用经验总结 3.绘图相关操作 ...

  5. pandas库基础学习

    pandas库基础学习 1.Pandas模块的数据结构 Pandas模块的数据结构主要有两种: Series DataFrame Series 是一维数组,基于Numpy的ndarray 结构 Dat ...

  6. pandas读取csv写入mysql_使用python的pandas库读取csv文件保存至mysql数据库

    第一:pandas.read_csv读取本地csv文件为数据框形式 data=pd.read_csv('G:\data_operation\python_book\chapter5\\sales.cs ...

  7. Python中pandas库实现数据缺失值判断isnull()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中pandas库实现数据缺失值判断 isnull()函数 ...

  8. Python之Pandas库常用函数大全(含注释)

    前言:本博文摘抄自中国慕课大学上的课程<Python数据分析与展示>,推荐刚入门的同学去学习,这是非常好的入门视频. 继续一个新的库,Pandas库.Pandas库围绕Series类型和D ...

  9. 如何最简单、通俗地理解Python的pandas库?

    pandas是一个Python软件包,提供快速.灵活和富有表现力的数据结构,旨在使处理 "关系型 "或 "标签型 "数据变得简单和直观 这个解释是比较官方的. ...

最新文章

  1. 2010提高组-乌龟棋 [记忆优化搜索]
  2. python编程课程价格-无锡Python程序开发课程
  3. preparedStatement问号的深入理解
  4. NodeJS在CentOs7下安装
  5. HBase运维基础——元数据逆向修复原理
  6. 主线程是如何向子线程传递数据的?_c++ 利用thread创建线程
  7. 面向对象:类的定义和使用
  8. 深夜不眠,爬起来写博客
  9. 【印刷字符识别】基于matlab OCR印刷字母+数字识别【含Matlab源码 287期】
  10. 没有 4K 和新处理器,任天堂的新 Switch 为什么还能吸引圈外玩家买单?
  11. c语言网络病毒代码大全,C语言病毒 - 各类源码 - 中国红客联盟 - Powered by HUC
  12. 力扣刷题 DAY_77 贪心
  13. java接入支付宝支付api
  14. 基于SSH的实验室预约管理系统
  15. 基于Tomcat的MQ学习月记
  16. 2021年辽宁省大学生数学建模
  17. 轻松转换CAJ文件为PDF格式:免费工具和技巧
  18. 远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转 服务器源代码,socket多线程并发通讯
  19. Python 基于 opencv 的车牌识别系统, 可以准确识别车牌号
  20. 【饭谈】计算机专业刚毕业该何去何从?博主的亲身经历告诉你....

热门文章

  1. 输入某年某月某日,判断这一天是这一年的第几天?(JS实现)
  2. pixhawk飞控解锁方法
  3. PIX学习路径-1-选择PIXHAWK作为飞控学习的起点
  4. 【C语言】结构体指针与结构体数组
  5. cad怎么倒圆角_学不好CAD怎么办?9个实用的CAD技巧,让你轻松玩转CAD
  6. 十一届蓝桥模拟赛 元辅音字母 JAVA
  7. 广告产品经理入门必修课02-DSP广告平台搭建
  8. 2D变形:平移、旋转、缩放、倾斜
  9. 天微TM1650数码管驱动IC新旧版 驱动和注意事项
  10. 如何做好python自动化运维,python在运维中的应用