Pandas光速入门-一文掌握数据操作

Posted 吾仄lo咚锵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas光速入门-一文掌握数据操作相关的知识,希望对你有一定的参考价值。

文章目录

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

简介


Pandas是Python的一个强大的数据分析库,是基于NumPy开发的。可以支持从各种格式的文件中导入数据,比如CSV、EXCEL、JSON、SQL等,并提供了两种数据结构Series和DataFrame,可以方便的对数据进行操作运算清洗加工等。

对了,与Python取自蟒蛇不同,Pandas取自Panel Data & Python Data Analysis(面板数据与Python 数据分析),而不是熊猫(doge)。

本文主要参考pandas文档
Python环境搭建-从安装到Hello World

安装


如果使用pip安装:

pip install pandas

如果使用conda安装:

conda install pandas

如果使用的是Pycham,可以直接打开File->settings->Project:->Python Interpreter中安装库。



可以打印pandas版本号即安装成功(●’◡’●)

import pandas as pd
print(pd.__version__)

一般定义别名pd

数据结构


Paddas定义了两个数据结构Serise和DataFrame。

  • Serise

Serise表示一维数据,可以理解位一维数组,或一列。

使用函数pandas.Series(data, index, dtype, name, copy)创建,介绍其中两个主要参数:1、data,数据源;2、index(可选),索引,默认从数字0开始,也可以自定义索引。

举个栗子:

import pandas as pd

data = ["点赞", "收藏", "评论"]  # 定义数据
var = pd.Series(data)  # 创建一个Series型变量var
print(var)


自定义索引例子:

import pandas as pd

data = ["点赞", "收藏", "评论"]
var = pd.Series(data, index=["a", "b", "c"])  # 指定索引为a、b、c
print(var)
print(var["a"])  # 打印索引a对应数据

print("----------")
data2 = "a": "点赞", "b": "收藏", "c": "评论"
var2 = pd.Series(data2)  # 等价于使用key-value数据
print(var2["b"])


更多属性和方法可以用的时候查阅文档,不便赘述,后同。

  • DataFrame

DataFrame表示二维数据,即二维数组,或表格。是由若干列Series组成的,每列的数据类型可以不同。

使用函数pandas.DataFrame(data, index, columns, dtype, copy)创建,data和index参数同Series,columns是列名,其实对应Series中的name。

import pandas as pd

data = [['Alice', 18], ['Bob', 20]]
var = pd.DataFrame(data, columns=['Name', 'Age'])  # 指定列名
print(var)
print("----------")
print(var['Name'])  # 打印指定列
print("----------")
print(var.loc[0])  # 打印第一行

# 与上等价
data2 = 'Name': ['Alice', 18], 'Age': ['Bob', 20]
var2 = pd.DataFrame(data2)  # 等价同上

数据读写


上面的数据是直接定义的,但实际场景往往是从文件中读写数据,pandas可以支持很多文件格式,读取文件函数一般命名是read_*(路径),比如常用的CSV文件读取使用函数read_csv(),类似的写文件函数是to_*(路径)。

这里以Kaggle中鸢尾花数据为例(下载链接),将文件解压到D盘。可以使用绝对路径D:\\Iris_flower_dataset.csv,也可以将文件放在项目根目录下直接使用相对路径即可。

import pandas as pd

data = pd.read_csv("D:\\\\Iris_flower_dataset.csv")
print(data)
print("----------")
print(data.to_string())

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/
读写其他格式的文件也是一样的,也可以从格式A读取后写成格式B文件,排列组合。

import pandas as pd

data = pd.read_csv("D:\\\\Iris_flower_dataset.csv")
print(data.to_numpy())  # 转成numpy
data.to_json("D:\\\\Iris_flower_dataset.json")  # 写为json文件
data.to_xml("D:\\\\Iris_flower_dataset.xml")  # 需要lxml库支持 pip install lxml
data.to_excel("D:\\\\Iris_flower_dataset.xlsx")  # 需要openpyxl库支持 pip install openpyxl

数据运算


如果学过关系型数据库SQL的话,就很好理解。pandas对表的操作大多都支持,比如连接、合并、分组等操作。

比如函数concat(objs, axis, join, ignore_inde, keys, levels, names, verify_integrity, sort, copy)连接合并数据,主要参数objs表示数据;axis默认0表示以行为连接轴,为1表示以列为连接轴;join可以选外连接outer(默认)和内连接inner;ignore_inde默认Fasle,为True则忽略原索引;keys设置外层索引等;names设置索引名;

import pandas as pd
# 合并数据
s1 = pd.Series(['a', 'b'])
s2 = pd.Series(['c', 'd'])
print(pd.concat([s1, s2]))
# 忽略原索引
print("----------")
print(pd.concat([s1, s2], ignore_index=True))
# 设置外层索引
print("----------")
print(pd.concat([s1, s2], keys=['s1', 's2']))
# 设置索引名
print("----------")
print(pd.concat([s1, s2], keys=['s1', 's2'], names=['Series name', 'Row ID']))
# 外连接
print("----------")
df1 = pd.DataFrame(
    
        "A": ["A0", "A1", "A2", "A3"],
        "B": ["B0", "B1", "B2", "B3"],
        "C": ["C0", "C1", "C2", "C3"],
        "D": ["D0", "D1", "D2", "D3"],
    ,
    index=[0, 1, 2, 3],
)
df2 = pd.DataFrame(
    
        "B": ["B2", "B3", "B6", "B7"],
        "D": ["D2", "D3", "D6", "D7"],
        "F": ["F2", "F3", "F6", "F7"],
    ,
    index=[2, 3, 6, 7],
)
print(pd.concat([df1, df2], axis=1))
# 内连接
print("----------")
print(pd.concat([df1, df2], axis=1, join="inner"))

使用函数groupby(by, axis, level, as_index, sort, group_keys, squeeze, observed, dropna)进行分组聚合,主要参数by设置需要映射的列;axis默认0表示以行为连接轴,为1表示以列为连接轴;level指定多层索引的组;dropna默认True删除含NA的行和列,为False则不删NA的行列。
然后可以对分组进行相关操作,如求和、平均数、最小最大值等等。

import pandas as pd

# 以Animal分组求Max Speed平均数
df = pd.DataFrame('Animal': ['Falcon', 'Falcon',
                              'Parrot', 'Parrot'],
                   'Max Speed': [380., 370., 24., 26.])
print(df)
print(df.groupby(['Animal']).mean())
# 是否显示NaN
print("----------")
l = [[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]]
df2 = pd.DataFrame(l, columns=["A", "B", "C"])
print(df2)
print(df2.groupby(['B']).sum())
print(df2.groupby(['B'], dropna=False).sum())

数据清洗


数据清洗是对一些无用的数据进行处理,以免影响实验结果,比如空值、错误格式、错误数据、重复数据等。

  • 空值

对于空值,我们可以使用dropna()函数进行删除,或者使用fillna()函数对空值进行填充,比如可以填充平均数mean()、中位数median()、众数mode()或自定义等。

DataFrame.dropna(axis, how, thresh, subset, inplace)其中axis默认为0,表示逢空值删除整行,置为1则删除整列;how默认为 ‘any’ 如果一行(或列)有任何一个 NA 就去掉整行,置为’all’则 一行(或列)都是 NA 才去掉这整行;subset:指定要检查的列;inplace默认False,表示返回一个新的DataFrame,否则返回None并覆盖原数据。

import pandas as pd

df = pd.DataFrame([1, None, 3, 5], columns=["value"])
print(df)
# 删除空值
print("----------")
print(df.dropna())
# 填充空值
print("----------")
mid = df.median()  # 计算中位数
print(df.fillna(mid))

  • 错误格式

比如使用to_datetime()函数统一日期,to_numeric()统一浮点数,to_timedelta()统一时间。

import pandas as pd

# 统一日期格式
df = pd.DataFrame(['2022/9/01', '2022-09-02', '20220903'], columns=["Date"])
print(pd.to_datetime(df['Date']))
# 统一浮点数
print("----------")
df2 = pd.DataFrame(['20.2', '2022'], columns=["Number"])
print(pd.to_numeric(df2['Number']))
# 统一实际格式
print("----------")
df3 = pd.DataFrame(['1 days 06:05:01', '15.5s', '1h'], columns=["Time"])
print(pd.to_timedelta(df3['Time']))

  • 错误数据

可以使用drop()删除,或者loc()修改。根据实际场景进行操作即可。

import pandas as pd

person = 
    "name": ['AlicE', 'Bob', 'CASEY'],
    "age": [18, 340, 22]

df = pd.DataFrame(person)
# 删除年龄>120的
for x in df.index:
    if df.loc[x, "age"] > 120:  #loc[行索引,列名]
        df.drop(x, inplace=True)
# 修改名字为小写
for x in df.index:
    df.loc[x, "name"] = df.loc[x, "name"].lower()
print(df)

  • 重复数据

使用drop_duplicates() 函数可以直接删除重复值。

import pandas as pd

person = 
    "name": ['AlicE', 'Bob', 'Bob'],
    "age": [18, 34, 34]

df = pd.DataFrame(person)
print(df.drop_duplicates())

数据可视化


pandas里的plot()函数其实是对Matplotlib的封装,具体的绘图可参考我这篇博客:Matplotlib光速入门-从安装到绘图实战,这边简单举个例子就润了。

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

# Series
ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))
ts = ts.cumsum()
ts.plot()
# DataFrame
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD"))
df = df.cumsum()
df.plot()

plt.show()

原创不易,请勿转载本不富裕的访问量雪上加霜
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤

以上是关于Pandas光速入门-一文掌握数据操作的主要内容,如果未能解决你的问题,请参考以下文章

教程 | 一文入门Python数据分析库Pandas

入门Pandas必须掌握的技巧

多个岗位需要的sql语言 你掌握了吗?简单例子+详细代码带你一文掌握

多个岗位需要的sql语言 你掌握了吗?简单例子+详细代码带你一文掌握

多个岗位需要的sql语言 你掌握了吗?简单例子+详细代码带你一文掌握

光速入门MyBatis-Plus