Python_pandas

python_pandas库

pandas简介

概述

PandasPythonopen in new window 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具

适用数据类型:

  • 与 SQL 或 Excel 表类似的,含异构列的表格数据;
  • 有序和无序(非固定频率)的时间序列数据;
  • 带行列标签的矩阵数据,包括同构或异构型数据;
  • 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。
环境安装

pip install numpy==1.21.6 -i https://pypi.tuna.tsinghua.edu.cn/simple/

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple pandas

数据结构

Pandas是python第三方库,提供高性能易用数据类型和分析工具。Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用。

Pandas 的主要数据结构是Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例

pandas主要数据结构:

维数名称描述
1Series带标签的一维同构数组,一维数据,一行或一列
2DataFrame带标签的,大小可变的,二维异构表格二维数据,整个表格,多行多列;

Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。

df.columns—列,字段 df.index—行索引

Series

Series是一种类似于一维数组的对象,它是由一组数据(不同数据类型),以及一组与之相关的数据标签(即索 )组成.

创建数据
  1. 使用数据列表产生最简单的Series

    def ser():
        # 使用列表/元组数据产生series数据
        data = pd.Series([1, "aa", "Hello World"])
        # 打印索引序列
        print(data.index)
        # 打印数据列表
        print(data.values)
    
  2. 创建自带索引的数据

def ser2():
    # 在数据列表后面增家index配置,自定义索引
    data = pd.Series([1, "aa", "Hello World"], index=["青蛙", "蛤蟆", "牛蛙"])
    print(data)
  1. 使用字典创建Series

    def ser3():
        # 使用字典创建Series对象
        data = pd.Series({"大象": "象牙山", "老虎": "泰哥", "狗熊": "光头强"})
        print(data)
    
访问数据

通过索引访问

def ser3():
    # 使用字典创建Series对象
    data = pd.Series({"大象": "象牙山", "老虎": "泰哥", "狗熊": "光头强"})
    # 访问一个值
    print(data["大象"])
    # 访问多个值,返回Series
    print(data[["大象", "狗熊"]])

DataFrame
创建/访问
"""
@File   : 表格读取.py
@Author : hqyj_cl
@Date   : 2023/11/16
"""
import pandas as pd

weather = pd.read_excel('./excel/weather.xlsx')
# 访问前几行
print(weather.head(3))
# 访问后几行
print(weather.tail(3))
# 查看序列
print(weather.index)
# 查看数据
print(weather.values)
# 列行访问
print(weather['weather_id'][0])
# loc访问 loc[行][列]
print(weather.loc[0]['weather_id'])
# iloc范文,纯索引访问 iloc[行][列]
print(weather.iloc[0][0])
print(weather.iloc[0][1])

# 控制填充
print(weather.fillna(0))
# 判断是否为空
print(weather.isnull())
print(weather.notnull())

# 排序 ascending=False 降序排列,默认为True,升序排列
print(weather.sort_values('heat',ascending=False))  # 根据列排序
print(weather.sort_index())

但是最常用创建DataFrame的方式是读取文件数据;

特性

Pandas 所有数据结构的值都是可变的,但数据结构的大小并非都是可变的,比如,Series 的长度不可改变,但 DataFrame 里就可以插入列。Pandas 里,绝大多数方法都不改变原始的输入数据,而是复制数据,生成新的对象。 一般来说,原始输入数据不变更稳妥。

pandas使用

pandas数据读取/存储

pandas需要先读取表格类型得数据,然后才能进行分析

数据类型说明pandas读取方法
csv,tsv,txt使用逗号,分割的纯文本文件pd.read_csv
excel表格pd_read_excel
mysql关系型数据库pd.read_sql
读取csv文件数据

read_csv()方法:

filepath_or_buffer:要读取的CSV文件的路径或URL。

sep:指定字段之间的分隔符,默认为逗号(‘,’)。

header:指定哪一行应该作为列名,默认为0,表示使用第一行作为列名。如果设置为None,则不使用列名。

index_col:指定哪一列作为索引列。默认为None,表示不使用索引列。

usecols:指定要读取的特定列,可以是列名列表或列索引列表。

dtype:指定每列的数据类型。可以是字典,将列名映射到数据类型,或者是一个数据类型,将所有列都设置为相同的数据类型。

skiprows:跳过指定行数的行。

nrows:仅读取指定行数的行。

def read():
	#读取文件内部数据
    data = pd.read_csv('ss.csv')
    print(data)
        # head()方法获取前面几排数据,如果没有参数则默认10行
    print(data.head())
    # 获取数据的行数,列数(2282, 12),也就是数据形状
    print(data.shape)
    # 获取数据列名
    print(data.columns)
    # 获取每行数据索引
    print(data.index)
    # 获取每列的数据类型
    print(data.dtypes)

读取excel表格数据
def readExcel():
    data = pd.read_excel('ss.xlsx', 'Sheet1')
    print(data)
    # 获取前几排数据
    print(data.head())
    # 获取数据的行数,列数(2282, 12),也就是数据形状
    print(data.shape)
    # 获取数据列名
    print(data.columns)
    # 获取每行数据索引
    print(data.index)
    # 获取每列的数据类型
    print(data.dtypes)
读取数据库数据
def read_sql():
    # 获取数据库连接
    con = pymysql.connect(host="localhost", port=3306, user="root", password="root", db="finance")
    # 通过sql语句读取数据库数据
    data = pd.read_sql("select * from `user`", con=con)
    print(data)

数据存储
import pandas as pd
from sqlalchemy import create_engine

# pandas文件类型:excel文件,csv文件,sql文件
import pymysql
data = {"序号": [1, 2, 3, 4, 5], "姓名": ["张三", "李四", "张学友", "郭富城", "刘德华"]}
# 使用字典创建一个二维数组,此时的数据会发现会多出一列索引列
data = pd.DataFrame(data)
# print(type(data), data)
# 设置索引列(将序号列设置成索引列)
data = data.set_index("序号")
print(data)

# 存储到文件中
data.to_csv("./csv/startName.csv")
data.to_excel("./excel/startName.xlsx")
# to_sql()方法需要使用SQLAlchemy的数据库连接对象作为参数。
engine = create_engine('mysql+pymysql://root:root@localhost:3306/finance')
# name:数据库名称,con:数据库连接  if_exists:是否创建之后的处理, index:是否将索引作为序列
data.to_sql(name="start_name", con=engine, if_exists='replace', index=True)

查询数据

pandas查询数据的结果分三种类型他,也类似于我们数据库查询数据的结果,分别为 单个值,Series数据,dataFrame数据

loc方法

pandas的loc是用于通过标签索引选取数据的方法。它主要用于定位和访问DataFrame或Series中的特定行和列。

df.loc[row_label, column_label]

  • row_label:可以是单个标签、标签列表或布尔条件,用于选择行。
  • column_label:可以是单个标签、标签列表或布尔条件,用于选择列。
  • 使用:表示所有行或者列
使用单个lable值查询数据

行和列都可以传入单个值实现精确匹配

    # 得到单个值                                
    print(financeData.loc[600000, "最低价"])  
使用值列表查询数据
    # 得到给列表行的Series数据                                        
    print(financeData.loc[[600000, 600004, 600006], "开盘价"])  
    print(financeData.loc[600000, ["开盘价", "收盘价", "成交额"]])    
                                                              
    # 得到给定区间的dataFrame数据                                     
    print(financeData.loc[[600000, 600012], ["最高价", "最低价"]]) 
使用值区间查询数据
    # 得到给定行index区间的单列数据数据                                   
    print(financeData.loc[600000:600054, "开盘价"])            
                                                            
    # 给定行index区间的多列数据                                       
    print(financeData.loc[600000:600012, ["开盘价", "收盘价"]])   
                                                            
    # 给定列index区间数据                                          
    print(financeData.loc[600012, "股票名称":"收盘价"])            
                                                            
    # 行列按index区间获取数据                                        
    print(financeData.loc[600012:600026, "股票名称":"收盘价"])     
使用条件表达式查询数据
    # 筛选开盘价数据这一列大于1000的数据,列为全部                                 
    print(df.loc[df["开盘价"] > 1000, :])                         
    # 打印条件的数据                                                  
    print(df["开盘价"] > 10)                                      
    # 多个条件,使用小括号将每个条件圈起来,通过&符号进行连接                                         
    print(df.loc[(df["开盘价"] > 500) & (df["成交量"] > 200000), :]) 
使用函数查询数据

pandas添加数据

赋值添加
def tianjia():
    df = pd.read_csv("ss.csv")
    # 新增列"涨跌价格",涨跌价格由收盘价-开盘价得来
    df.loc[:, "涨跌价格"] = df["收盘价"] - df["开盘价"]
    # 输出这几个价格
    print(df.loc[:, ["开盘价", "收盘价", "涨跌额", "涨跌价格"]])
apply函数

pandas库中的apply函数是一种基于某个函数对DataFrame或Series中的数据进行逐行或逐列操作的方法。

使用方法为:df.apply(func,axis=…),其中,func是应用到每行或每列上的函数,axis表示在哪个维度(0表示列,1表示行)上执行该函数。如果是Series类型,则省略axis参数。

def tianjia():
    df = pd.read_csv("ss.csv")
    # 新增列"涨跌价格",涨跌价格由收盘价-开盘价得来
    df.loc[:, "涨跌价格"] = df["收盘价"] - df["开盘价"]
    # pandas中的apply方法是一种数据变换技术,它可以对DataFrame或Series对象的行或列进行元素级的函数应用。
    # apply方法能够接受一个函数作为输入,并将该函数应用到指定的行或列上,然后返回一个新的DataFrame或Series对象。
    df.loc[:, "股票走势"] = df.apply(fun1, axis=1)
    # 输出这几个价格
    print(df.loc[:, ["开盘价", "收盘价", "涨跌额", "涨跌价格","股票走势"]])
    # 对某列的值进行计数,例:对股票走势这一列进行计数
    print(df["股票走势"].value_counts())


def fun1(x):
    if x["收盘价"] - x["开盘价"] > 0:
        return "涨"
    elif x["收盘价"] - x["开盘价"] < 0:
        return "跌"
    else:
        return '不变'
assign方法

使用assign方法可以添加多个列

def assignTest1():
    df = pd.read_csv("ss.csv")
    # 同时多列数据进行添加
    df = df.assign(
        股票走势=df["开盘价"] - df["收盘价"],
        涨跌价格=df["收盘价"] - df["开盘价"]
    )
    print(df.head())
按条件进行分组分别赋值
# 按条件进行分组分别赋值
def fuzhi():
    df = pd.read_csv("ss.csv")
    # 先赋值一列空值
    df["走势"] = ""
    # 根据数据关系对数据进行赋值
    df.loc[df["收盘价"] >= df["开盘价"], "走势"] = "盈利"
    df.loc[df["收盘价"] < df["开盘价"], "走势"] = "亏损"
    print(df.loc[0:5, ["股票编号", "股票名称", "走势"]])

pandas数据统计

汇总类统计 唯一去重和按值计数
def huan():
    df = pd.read_csv("ss.csv")
    df = df.loc[:, ["股票名称", '开盘价', "收盘价", "最高价"]]
    df["价格变化"] = df["收盘价"] - df["开盘价"]
    print(df.head(5))
    # 全局统计  含最小值 最大值 平均值等数据
    print(df.describe())
    # 唯一去重
    print(df["价格变化"].unique())
    # 按值计数
    print(df["价格变化"].value_counts())
相关系数和协方差

在pandas中,可以使用corr()函数计算相关系数,使用cov()函数计算协方差。这些函数可应用于DataFrame或Series对象。

def xiangguan():
    df = pd.read_csv("ss.csv")
    df = df.loc[:, ["股票名称", "涨跌额", "成交量"]]
    print(df.head(10))
    # corr(): 用于计算两个或多个变量之间的相关性。默认情况下,它计算列与列之间的相关性,并返回一个相关系数矩阵。
    # corr(method='pearson'): 设置方法参数来指定计算相关系数的方法。常见的相关系数方法包括Pearson相关系数(默认)、Spearman秩相关系数和
    # KendallTau相关系数。
    print(df.corr())
    # 协方差(Covariance):cov(): 用于计算两个或多个变量之间的协方差。默认情况下,它计算列与列之间的协方差,并返回一个协方差矩阵。
    print(df.cov())

pandas添加列警告

def aaa():
    df = pd.read_csv("ss.csv")
    # 先通过loc获取某几行数据,在添加"走势"列,此时会报警告SettingWithCopyWarning
    # 原因:这个数据是通过条件获取到的子数据,并不是copy的原数据,所以不能在这儿更改列信息
    # df.loc[df["开盘价"] > 200]["走势"] = df["收盘价"] - df["开盘价"]
    # 解决方法1:
    # df.loc[df["开盘价"] > 200, "走势"] = df["收盘价"] - df["开盘价"]
    # 解决方法2:
    data = df.loc[df["开盘价"] > 200].copy()
    data["走势"] = df["收盘价"] - df["开盘价"]
    print(data)

归根结底就是:pandas不允许先筛选子dataFrame在进行修改写入.

pandas数据排序

series排序
# series排序
def seriesSort():
    df = pd.read_csv("ss.csv")
    # 获取Series数据
    data = df["开盘价"]
    # 对Series进行排序 ascending:排序方式:默认true为升序排序 False为降序排序  inplace为是否改变原数据Series
    print(data.sort_values(ascending=False, inplace=False))
    print(data)
dataFrame排序
  1. 单列排序

    def dataFrameSort():
        df = pd.read_csv("ss.csv")
        # 对dataFrame进行排序:by:通过什么进行排序,可以是字符串或者列表(字符串)
        # ascending:bool或者list数据,升序还是降序,如果是多列对应着by的数据  inplace为是否改变原数据的dataFrame
        # 单列排序
        print(df.sort_values(by="开盘价", ascending=False, inplace=False))  # 按照开盘价降序排列
        print(df.sort_values(by="涨跌额", ascending=True, inplace=False))  # 按照涨跌额升序排列
    
  2. 多列排序

    def dataFrameSort2():
        df = pd.read_csv("ss.csv")
        # 对dataFrame进行排序:by:通过什么进行排序,可以是字符串或者列表(字符串)
        # ascending:bool或者list数据,升序还是降序,如果是多列对应着by的数据  inplace为是否改变原数据的dataFrame
        # 多列排序
        print(df.sort_values(by=["开盘价", "涨跌额"], ascending=[True, False], inplace=False))
    

pandas数据可视化

将数据可视化的意义在于可以直观的看到数据之间的关系.将繁琐的数据展示到图表上.常用图表由柱形图,折线图,扇形图,箱型图,散点图等

安装:pip install matplotlib

参数列表
折线图
import matplotlib.pyplot as plt
import pandas as pd

# 设置字体
# plt.rcParams['font.sans-serif']=['SimHei']
# 读取表格内容
wd = pd.read_excel('./excel/weather.xlsx')
# 截取某些列
wd1 = wd.loc[:, ['area', 'heat', 'humidity']]
# 排序
print(wd1.sort_values("heat", ascending=False))
# 折线图配置
plt.plot(wd['area'], wd['heat'], label='温度')
# 标题设置
plt.title("温度折线图")
# 设置x,y轴标题
plt.xlabel("地区")
plt.ylabel("温度")
# 设置x轴字体斜体
plt.xticks(wd["area"], rotation=45)
# 设置y轴负数
plt.ylim([-5, 5])
# 图例/图表展示
plt.legend()
plt.show()
柱形图

在这里插入图片描述

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 设置字体
# plt.rcParams['font.sans-serif']=['SimHei']
# 读取表格内容
wd = pd.read_excel('./excel/weather.xlsx')
# 截取某些列
wd1 = wd.loc[:, ['area', 'heat', 'humidity']]
# 排序
print(wd1.sort_values("heat", ascending=False))
# 柱形图配置
# x:x轴数据  height:y轴数据  width:宽度  color:颜色
plt.bar(x=wd1["area"], height=wd1["heat"], color="red", width=0.4,label="温度")
# 相邻柱状图g
plt.bar(x=np.arange(len(wd1["area"])) + 0.4, height=wd1["humidity"], color="blue", width=0.4,label="相对湿度")
# 标题设置
plt.title("温度柱形图图")
# 设置x轴字体斜体
plt.xticks(wd["area"], rotation=45)

# 图例/图表展示
plt.legend()
plt.show()		
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值