Python知识分享第三十四天-Pandas进阶

devtools/2024/12/24 9:29:54/

Pandas

pandassql_1">pandas读写sql表

python">import pandas
import pandas as pd
from sqlalchemy import create_engine
import json
import os
os.chdir(r'D:\code\ai_22_work\My_Numpy\day03')
# 读取csv文件
df = pd.read_csv('./data/csv示例文件.csv',encoding='gbk',index_col=0)# pandas读写sql表
# 去你的base沙箱下, 安装两个包, pymysql, sqlalchemy
# 注意: 如下的命令是去 DOS窗口中执行的. pip install pymysql==1.0.2 -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 如果后边的代码运行提示找不到sqlalchemy的包,和pymysql一样进行安装即可
pip install sqlalchemy==2.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/# 创建引擎对象
"""
参数解释: (1) mysql+python --> 要操作的数据库 具体用的包(2)  root:123456 --> 要操作的数据库的账户和密码(3)  localhost:3306 --> 药品操作的数据库的IP和端口号(4)  db2   --> 具体操作的数据库名(5)  charset --> 码表
完整格式: 要操作的数据库类型+pymysql://数据库账号:密码@数据库IP:端口号/数据库名?charset=码表 
"""
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/db2?charset=utf8')
engine  # Engine(mysql+pymysql://root:***@localhost:3306/db2?charset=utf8)
# pandas写入数据到SQL表中
# 1.确保MYSQL服务已启动 目标数据库已创建 2.导包 (from sqlalchemy import create_engin)  3.读取csv文件 获取df对象 它的信息就是要往SQL表中写的数据
#index_col = 0   设置编号为0的列  充当索引列
df.to_sql('stu', engine,index=False,if_exists='append')  # 存在就追加
df.to_sql('stu', engine,index=False,if_exists='replace')  # 存在就替换#pandas 从SQL表中读取数据
# 参1 SQL 语句 参2 数据库引擎对象
pd.read_sql('select * from stu', engine)
# 添加指定列
pd.read_sql('select name, AKA from stu',engine)

pandasjson_45">pandas读写json格式

python"># pandas读取json格式
# 准备动作 演示Python字典和Json字符串互换
# 导包   (import json)
# json是一种特殊的字符串格式 数值可以直接写 其他类型 要用引号包裹
dict_data = {'name':'kunkun','age': 38,'gender':'女'}
# 把字典转换成json字符串
json_str = json.dumps(dict_data,ensure_ascii=False)  # ensure_ascii参数 意思是 是否把中文转成ASCII码
print(json_str)
print(type(json_str))# json字符串-> Python字典
# loads()函数 可以加载json字符串 转换成python字典
new_dict = json.loads(json_str)
print(new_dict)
print(type(new_dict))# Pandas读取json文件
pd.read_json('./data/my.json',orient='recorde',lines=True)
#df = pd.read # pandas把df对象 写到json文件
df
df.to_json('./data/my_out1.json',orient='records',lines=True,force_ascii=False)
print('写出数据到json文件成功')

DataFrame数据的增删改查操作

python">import pandas
import pandas as pd
from sqlalchemy import create_engine
import json
import osos.chdir(r'D:\code\ai_22_work\My_Numpy\day03')
# 读取csv文件
df = pd.read_csv('./data/1960-2019全球GDP数据.csv', encoding='gbk')
# 1.DataFrame数据的增删改查操作
# 准备动作 读取数据获取df对象
df = pd.read_csv('./data/1960-2019全球GDP数据.csv', encoding='gbk')
# 基于df拷贝出df2
df2 = df.head().copy()
# df2# 增加列
# 方式一 df[列名] = 值  会修改原数据
df2['col1'] = 22
df2['col2'] = [1, 2, 3, 4, 5]
df2['col3'] = df2.year * 2# 方式二 df.assign(列名=值)   不会修改原数据
df2.assign(col4=22)
df2.assign(col5=[1, 2, 3, 4, 5])
df2.assign(col6= df2.year*2)
# assign 还支持传入Series对象
s1 = pd.Series(['吴亦凡','吴彦祖','吴克群','吴青峰','吴奇隆'])
df2.assign(col7= s1)# assign 还支持自定义函数
def my_fun(df):return 'hell0'
def my_func1(df):return df.index.values *2 df2.assign(col8 = my_fun)
df2.assign(col9 = my_func1)# 总结 assign() 可以用来增加列  不能直接修改原数据 且 assign() 支持同时传入多列
df2 = df2.assign(col1 = 22,col2 = [1, 2, 3, 4, 5],col3 = df2.year * 2,col4 = s1,col5 = my_fun,col6 = my_fun1
)
df2

删除和去重

python"># 删除和去重
# 结论  Series去重可以用drop_dupliicaters()  ;  unique()
# DataFrame去重  用drop_duplicates()# 删除行 drop不会删除原数据
df2.drop([0])   # 默认删除行
df2.drop([0],axis=0)  # 效果同上   0 --> 行  1-->列
# 同时删除多行
df2.drop([0,1,4])
# 删除列
df2.drop(['col1'],axis=1)
df2.drop(['col1','col3'], axis=1)#del方式删除  会修改原数据
del df2['col2']# 去重
drop_duplicates(),unique()
df2.drop_duplicates()  # 整行去重
df3 = df2[['county']].copy()df3.drop_duplicates(inplace=True)# df3.unique()  # 报错s1 = df1['country'].copy()
s1.drop_duplicates()
s1.unique()

修改列

python"># 修改列
# 获取数据集
df1 = pd.read_csv('./data/1960-2019全球GDP数据.csv',encoding='gbk')
df1
df2 = df1.head().copy()
df2
# df2['GDP'] =33  # 直接修改原数据# 方式二 不修改元数据 而是返回一个新的df对象
# df2.assign(GDP = 66)
# 
# 方式三 replace函数来替换数据 
df2.year.replace(1960, 2024, inplace=True)
df2.replace('日本','小八嘎', inplace=True)
df2
df2.replace(['日本','美国',1960],['小八嘎','老外',2024])
# 同时修改多个值 列表方式 注意顺序要对应# 字典方式 则无顺序 要求
df2.replace({'中国':'龙国',1960:2024, '日本':'倭国'})

查看列

python"># 查看列
# 1. 准备数据.
df1 = pd.read_csv('./data/1960-2019全球GDP数据.csv', encoding='gbk')
# 2. 获取前n条数据.
df1.head()          # 默认是前5条
df1.head(10)        # 获取前10条数据.
# 3. 获取后n条数据.
df1.tail()      # 默认是后5条
df1.tail(10)    # 默认是后10条df1['year']
df1.year
df1[['year','country']]
# 索引下标切片 获取行
df2 = df1.head(10).copy()
# df2[:3]
# df2[:3]     # 前三行, 即: 索引0开始, 到索引3结束, 步长为: 1    包左不包右.
# df2[3:]     # 索引3开始, 到df末尾结束, 步长为: 1    包左不包右.
# df2[1:5:2]  # 索引1开始, 到索引5结束, 步长为: 2     包左不包右.
# df2[1::3]   # 索引1开始, 到df末尾结束, 步长为: 3    包左不包右.
# df2[-6:-2]  # 索引-6开始, 到索引-2结束, 步长为: 1   包左不包右.
# df2[2:-2:]  # 索引2开始, 到索引-2结束, 步长为: 1    包左不包右.df2[2:-2:-1]  # 索引2开始, 到索引-2结束, 步长为: -1    包左不包右. 什么也获取不到# df2[::-1]  # 翻转

query

python"># query() 函数 查看数据
#需求一查看中国数据集
df1.[df1.country =='中国']
df1.query('country == 中国')
# 需求二 查看中美日 2015~2019年的数据
df1.query('country in ["中国","美国","日本"]').query('year in [2015, 2016, 2017, 2018, 2019]')
df1.query('country in ["中国", "美国", "日本"] and year in [2015, 2016, 2017, 2018, 2019]')   # 效果同上.
df1.query('country in ["中国", "美国", "日本"] & year in [2015, 2016, 2017, 2018, 2019]')     # 效果同上.

排序

python"># 排序相关
df1 = pd.read_csv('./data/1960-2019全球GDP数据.csv',encoding='gbk')
# 按照行索引排序
df1.sort_index()  # 默认升序
df1.sort_index(ascending=False)
# 按照 列值 排序
df1.sort_values('GDP')                   # 默认: 升序
df1.sort_values('GDP', ascending=False)     # 降序.# 场景2: 按照 多列值 排序, 排序方式一样.
df1.sort_values(['year', 'GDP'])                        # 按照 year列 升序排列, 年份一样再按照 GDP列 升序 排序.
df1.sort_values(['year', 'GDP'], ascending= False)      # 按照 year列 降序排列, 年份一样再按照 GDP列 降序 排序.# 场景3: 按照 多列值 排序, 排列方式不同, 例如: 按照 year列 降序, GDP升序.
df1.sort_values(['year', 'GDP'], ascending=[False, True])# 排序 函数 rank 函数
df2 = pd.DataFrame({'姓名':['小明','小美','小明','小兰'],'成绩':[100, 90, 90, 80]
})# 用rank()
df2.rank(ascending=False)                       # 按照成绩, 降序排名. 
df2.rank(ascending=False, method='average')     # 效果同上, 按照成绩, 降序排名.  评分一致, 取平均值 
df2.rank(ascending=False, method='min')         # 评分一致, 取最小值. 
df2.rank(ascending=False, method='max')         # 评分一致, 取最大值. # 掌握如下这个, 上述的了解排序原理即可.
df2.rank(ascending=False, method='dense')       # 数值相同, 评分一致.  等价于SQL中的 dense_rank()

缺失值判断

python">import pandas as pd
import numpy as np
from sqlalchemy import create_engine
import json
import osos.chdir(r'D:\code\ai_22_work\My_Numpy\day03')# 全局取消证书验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 缺失值判断
# 加载数据 获取df对象
df = pd.read_csv('./data/movie.csv')
# df
# 判断每列缺失值的个数. 
df.isnull() # 判断是否为空.
df.notnull()    # 判断是否不为空df.isnull().sum()# df.notnull().sum()# pd.notnull(df): 判断df中 列值是否不为空. True -> 不为空, False -> 为空
# np.all(df对象 == True): 判断df对象中所有元素是否为True.  是 -> True,  否则 -> False
# np.all(df == True)
# df

处理缺失值 -> 删除缺失值 dropna()

python"># 处理缺失值  -> 删除缺失值 dropna()
# 删除缺失值
df.dropna(inplace=True) # 默认: axis = 0 -> 删除行.
# df.dropna(inplace=True, axis=1) # axis = 1 -> 删除列.
df.info()
df.isnull().sum()# 处理缺失值  填充缺失值 fillna()
# 用 Revenue (Millions) 列的平均值, 来填充 所有列的 NaN(缺失值), 虽然实现了效果, 但是不够灵活. 
df.fillna(df['Revenue (Millions)'].mean())# 用每列的平均值 来填充 每列的缺失值
df['Revenue (Millions)'].mean()     # 82.95637614678898
df['Metascore'].mean()              # 58.98504273504273for col_name in df.columns:if df[col_name].isnull().sum() >0:# if np.all(pd.notnull(df[col_name])) == False:df[col_name].fillna(df[col_name].mean(),inplace=True)df

如果有特殊标记, 先转换, 然后再处理缺失值.

python"># 如果有特殊标记, 先转换, 然后再处理缺失值.
# 1. 加载源数据.
wis = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data")
wis# 2. 查看每列的缺失值情况.
wis.info()
# 3. 把特殊标记 -> NaN (细节: 空可以用 Numpy中的 nan, NaN, NAN来表示, 效果都一样)
# print(np.nan)
# print(np.NaN)
# print(np.NAN)
wis.replace('?', np.nan, inplace=True)
wis
# 4. 删除缺失值.
wis.dropna(inplace=True)
wis.info()

演示pd.concat() 合并方式

python">import pandas as pd
import numpy as np
import osos.chdir(r'D:\code\ai_22_work\My_Numpy\day03')# 准备数据.
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],'key2': ['K0', 'K1', 'K0', 'K1'],'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']})right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],'key2': ['K0', 'K0', 'K0', 'K0'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']})
df3 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],'key2': ['K0', 'K0', 'K0', 'K0'],'E': ['E0', 'E1', 'E2', 'E3'],'F': ['F0', 'F1', 'F2', 'F3']},index=[10, 11, 12, 13])# 演示pd.concat() 合并方式
# 合并left 和 right, 默认是: 纵向合并(0 -> 列), 参考: 列名.
# 即: 列名一样的合并, 不一样的有值就用值填充, 无值就用NaN填充. 
pd.concat([left, right])
pd.concat([left,right],axis=0)
pd.concat([left,right],axis=0,ignore_index=True)  # 纵向合并 -> 列合并, 忽略索引.# 2. 合并left 和 right, 指定: 横向合并(1 -> 行), 参考: 行索引.
pd.concat([left, right], axis=1)    # 横向合并 -> 行合并(axis = 1)
# 验证: 横向合并参考行索引, 不匹配用NaN填充.
pd.concat([left, df3], axis=1)      # 横向合并 -> 行合并(axis = 1)# pd.concat()总结:  
#   1. 可以同时拼接多个df对象.    
#   2. concat可以做行合并(axis=1, 横向合并), 也可以做列合并(axis=0, 纵向合并, 默认的).    
#   3. 行合并参考行索引, 列合并参考列名, 不匹配用NaN填充.
#   4. concat()默认是: outer(满外连接)pd.concat([left, right, df3])

演示pd.merge() 合并方式

python"># 演示pd.merge() 合并方式
# 场景1: 用1个字段做关联. 
# 2. 演示: 左外连接.
# 参1: 第1个df对象.
# 参2: 第2个df对象,
# 参3: 连接方式 -> left(左外连接), right(右外连接), inner(内连接), outer(全连接, 满外连接).
pd.merge(left, right, how='left', on='key1')# 3. 演示: 右外连接
pd.merge(left, right, how='right', on='key1')# 4. 演示: 内连接
pd.merge(left, right, how='inner', on='key1')
pd.merge(left, right, on='key1')        # 效果同上, 默认是内连接.# 5. 演示: 满外连接.
pd.merge(left, right, how='outer', on='key1')# 场景2: 用 多个字段(这里是2个字段做关联)
# 1. 演示: 内连接.  关联字段是: key1 和 key2 作为整体进行关联.             两个df的交集.
pd.merge(left, right, how='inner', on=['key1', 'key2'])
pd.merge(left, right, on=['key1', 'key2']) # 效果同上, 默认是: 内连接.# 2. 演示: 左外连接, 关联字段是: key1 和 key2 作为整体进行关联.             左边df的全集 + 右边df的交集
pd.merge(left, right, how='left', on=['key1', 'key2'])# 3. 演示: 右外连接, 关联字段是: key1 和 key2 作为整体进行关联.             右边df的全集 + 左边df的交集
pd.merge(left, right, how='right', on=['key1', 'key2'])# 4. 演示: 满外连接, 关联字段是: key1 和 key2 作为整体进行关联.             左边df的全集 + 左右边df的交集 + 右边df的全集
pd.merge(left, right, how='outer', on=['key1', 'key2'])
pd.merge(left, right, how='outer', on=['key1', 'key2'])

坚持分享 共同进步 如有错误 欢迎指出


http://www.ppmy.cn/devtools/144940.html

相关文章

V900新功能-电脑不在旁边,通过手机给PLC远程调试网关配置WIFI联网

您使用BDZL-V900时,是否遇到过以下这种问题? 去现场配置WIFI发现没带电脑,无法联网❌ 首次配置WIFI时需使用网线连电脑,不够快捷❌ 而博达智联为解决该类问题,专研了一款网关配网工具,实现用户现场使用手机…

详解大模型多轮对话的输入和输出token序列

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

【机器学习】机器学习的基本分类-强化学习-模型预测控制(MPC:Model Predictive Control)

Model Predictive Control (MPC) Model Predictive Control (MPC),即模型预测控制,是一种基于优化的控制算法,广泛应用于工业、自动驾驶、机器人等领域。它通过预测未来系统的行为,并在线解决优化问题来获得控制输入,…

探索 Samba 服务器:搭建跨平台文件共享的桥梁

samba 介绍 samba最先是再Linux和Windows两个平台之间建立一个桥梁,使得Linux系统和Windows系统之间互相通信和传输内容,比如复制文件、实现不同操作系统之间的资源共享等。在实际应用中,可以将samba服务器设置成一个功能非常强大的文件服务器。 SMB协…

专题八:背包问题

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是记忆化搜索,并且掌握记忆化搜索算法。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早…

公网IPV6如何使用IPV4网络访问——浪浪云

此教程主要解决IPV6的网络无法被没有IPV6的网络环境所访问,所以可以通过浪浪云家的IPV6 CDN服务将公网IPV6服务转换为IPV4所访问,应用场景如下,例如家里有公网IPV6 或者服务器只有IPV6网络,都可以通过浪浪云CDN转换为IPV4访问 以浪…

十二月第20讲:Python中指数概率分布函数的绘图详解

一、指数分布的理论概述 1. 定义与公式 指数分布是一种描述随机变量在一个固定底数上的对数值的分布情况,或者在概率理论和统计学中,用于描述泊松过程中事件之间的时间间隔的概率分布。具体来说,它表示事件以恒定平均速率连续且独立地发生的…

汽车IVI中控开发入门及进阶(45):凌阳科技车载娱乐芯片

概述: Sunplus科技有限公司成立于1990年,是一家领先的多媒体和汽车应用芯片提供商,如DVD播放器、便携式DVD播放器、家庭娱乐音频产品、汽车信息娱乐和高级驾驶辅助系统(ADAS)。与此同时,凌阳正在为消费类、便携式和连接设备上的广泛应用提供高速I/O IP、高性能数据转换I…