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'])
坚持分享 共同进步 如有错误 欢迎指出