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

举报
唔仄lo咚锵 发表于 2022/09/25 05:53:05 2022/09/25
【摘要】 文章目录 简介安装数据结构数据读写数据运算数据清洗数据可视化 简介 Pandas是Python的一个强大的数据分析库,是基于NumPy开发的。可以支持从各种格式的文件中导入数据,比...

在这里插入图片描述

简介


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

  
 
  • 1

如果使用conda安装:

conda install pandas

  
 
  • 1

如果使用的是Pycham,可以直接打开File->settings->Project:->Python Interpreter中安装库。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以打印pandas版本号即安装成功(●’◡’●)

import pandas as pd
print(pd.__version__)

  
 
  • 1
  • 2

一般定义别名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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
自定义索引例子:

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"])

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
更多属性和方法可以用的时候查阅文档,不便赘述,后同。

  • 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)  # 等价同上

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

数据读写


上面的数据是直接定义的,但实际场景往往是从文件中读写数据,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())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

插播反爬信息 )博主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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

在这里插入图片描述

数据运算


如果学过关系型数据库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"))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述

使用函数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())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

数据清洗


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

  • 空值

对于空值,我们可以使用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))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

  • 错误格式

比如使用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']))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

  • 错误数据

可以使用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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

  • 重复数据

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

import pandas as pd

person = {
    "name": ['AlicE', 'Bob', 'Bob'],
    "age": [18, 34, 34]
}
df = pd.DataFrame(person)
print(df.drop_duplicates())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

数据可视化


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()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述

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

文章来源: wzlodq.blog.csdn.net,作者:吾仄lo咚锵,版权归原作者所有,如需转载,请联系作者。

原文链接:wzlodq.blog.csdn.net/article/details/126894800

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。