【一起玩蛇】Python 结构化数据分析工具 Pandas | Series 与 DataFrame | 读取CSV文件数据 |

简介: 没什么好写的,不如直接开始。

💭 写在前面


没什么好写的,不如直接开始。


0x00 pandas 介绍

❓ Pandas 是什么?


熊猫?14年网龄的我,早就在互联网发表情包了,这种熊猫表情包我可太熟悉了。


但是我们今天要说的是 Python 里的 pandas,为了接地气本篇所有用的表情包都会是熊猫头。


" pandas 就是一个用于数据处理和分析的 python 库 "


pandas 支持读取和处理各种外部资源数据,比如读取 CSV 文件、文本文件、Excel 文件、web 数据等,还可以使用 matplotlib 可视化数据。


先提一嘴 pandas 的数据结构:


一维数据结构:Series

二维数据结构:Data Frame

三维数据结构:Panel

pandas 在数据中支持多种运算函数,使用 pandas 库需要引入头文件:

import pandas as pd

一般会 as pd 一下,这样用起来能更方便些。(就像 numpy 我们习惯去 as np 一样)


numpy 数组是所有元素都相同的数据类型,但 pandas 允许元素的数据类型不同,并生成结构数,比如 Series 和 DataFrame。


0x01 Series 数据结构

简单的一维数据结构,能展示出带有索引 (index) 的一维数组。


与 Numpy 中的一维 array 类似。它们都和 Python 基本的数据结构 List 相似。


现在的 Series 能保存不同数据类型,字符串、boolean 值、数字等,它们都能保存在 Series 中。


💬 用法演示:使用 pd.Series() 函数


可以指定参数 index,如果不指定 index 会默认从 0 开始。

import pandas as pd
data = [1, 3, 5, 7, 9]
# 不指定
s1 = pd.Series(data)
# 指定index
s2 = pd.Series(data, index = ["安娜", "末日铁拳", "麦克雷", "莱因哈特", "禅雅塔"])
print(s1, "\n\n", s2, "\n")
print(s2.values)   # 只打印值
print(s2.index)    # 只打印索引

🚩 运行结果:

735e47e563be54b68af1ddbd09a19ca4_96b366b7f67e487ba995b231789151fd.png



💬 用法演示:使用字典数据创建 Series


会将字典的键配置为 index,将字典的值配置为 values。

import pandas as pd
# 利用字典构造 series
data = pd.Series (
    {"苹果": "Apple", "橘子": "Orange", "香蕉": "banana", "桃子": "peach"}
)
print(data)
print(data.index)     # 打印索引
print(data.values)    # 打印值

🚩 运行结果

6140ccea96bbc92d483ed75ca6d9f6fb_26e62a8b14504bd4891fa605c5accf72.png


0x02 DataFrame 数据结构

二维的表格型数据结构,DataFrame 接受带行和列的表数据。


index 和列具有各自的标签(名称)

每个列可以有不同的数据类型

默认情况下,按列管理数据

可以将 DataFrame 理解为 Series 的容器。


可以将多种数据类型的数据转换为 Data Frame 数据结构:


字典、列表、nd-array 对象、Series 数据结构

使用 pd.DataFrame() 函数创建

生成的默认索引为从 0 开始的整数

可使用 index 关键字命名索引

可使用 columns 关键字命名列

eb91218d725fd28a06c1adce8172f65f_f8e1456fb2fc4a07bc73513cf219025f.png


💬 用法演示:使用 pd.DataFrame()

import pandas as pd
data = [
    [2019, 2.8, "1.63M"],
    [2020, 3.4, "1.75M"],
    [2021, 5.5, "1.84M"]
]
# 什么都不指定
df1 = pd.DataFrame(data)
print(df1, "\n")
# 指定 index 和 columns
df2 = pd.DataFrame (
    data,                                   # 数据
    index = [1, 2, 3],                      # 指定索引
    columns = ['year', 'GDP_rate', 'GDP']   # 指定列
)
print(df2)


🚩 运行结果:

88410a57f03cf08181945825e26a428e_7902d201d0324fa4bfba6a9676ef0e6f.png


💬 用法演示: 使用字典数据创建 DataFrame(字典的键为列名,字典的值为列值)


import pandas as pd
data = {"year" : [2019, 2020, 2021],
        "GDP_rate" : [2.8, 3.4, 3.0], 
        "GDP" : ["1.63M", "1.75M", "1.83M"]
}
## data 是一个字典
df = pd.DataFrame(data)    # 等同于 df = pd.DataFrame(data=data)
print(df, "\n")
print(df.iloc[1], "\n")    # row 引用类型:df.loc[index名称],df.iloc[index编号]
print(df["year"], "\n")    # 等同于 print(df.year)
                           # column 引用方法:df["列名"] 或 df.列名
## 查看数据类型
print(type(df.iloc[1]))
print(type(df["year"]))


🚩 运行结果

6a073a0260de8336b965f8afd36772fa_6982edd583254e92bfcca88ef9458b2d.png



💬 操作演示:如果在添加行时将其指定为现有索引名称,则会修改现有的数据值。


# 8
import pandas as pd
s1 = pd.Series( [2019, 2020, 2021] )
s2 = pd.Series( [2.8, 3.2, 3.0] )
s3 = pd.Series( ["1.63M", "1.75M", "1.87M"] )
data = {"year" : s1, "GDP_rate" : s2, "GDP" : s3}
df1 = pd.DataFrame(data)
print(df1, "\n")
names = pd.Series(["禅雅塔", "奥丽莎", "西格玛", "索洁恩", "卢西奥"])
scores = pd.Series([18030, 5069, 8958, 14560, 6800])
members = {"[姓名]": names, "[伤害量]" : scores}
df2 = pd.DataFrame(members)
print(df2, "\n")
df2["[表现]"] = ["A", "C", "B", "A", "D"]     # 列名以 Grade 添加列
df2.loc[5] = ["麦克雷", 15035, "A"]             # 添加行
print(df2)


🚩 运行结果:

a220ebf7537cf63b1b51124bae46ccd3_be40a66f76404d2e8bf738a9a8ee8fa6.png



我们之前提到了,numpy 也是可以塞里面的,我们来看看。

import numpy as np
import pandas as pd
data1 = np.array(
    [ [1, 2, 3], [4, 5, 6] ]    # 创建一个二维数组
)
df1 = pd.DataFrame(data1)
print(df1, "\n")
data2 = pd.Series( 
    {"苹果": "Apple", "橙子": "Orange",
    "香蕉": "banana", "桃子": "peach"}
)
df2 = pd.DataFrame(data2, columns = ["英文名"])
print(df2, "\n")
df3 = pd.DataFrame (
    data = [56, 90, 31], 
    index = range(1, 4),
    columns = ["价格"]
)
print(df3, "\n")


🚩 运行结果:

e8d76daf2f76eb6f1ac669a16908031d_a20e054ca25c417a955a00efb2afb8d3.png



0x03 索引与数据选择

刚才在注释里我们演示了一些 "数据引用",现在我们现在来正式讲一下这个知识点。


💭 我们假设变量 df 是 DataFrame 的对象:


列值索引:

df[列名]
df.列名1
df[[列名1, 列名2, ...]]   # 如果有多行要引用,可以写到列表里

切片作为索引:

df[起始位置, 结束位置]      # 从 start 开始到 end-1 行

行索引:

df.loc[行名]
df.loc[[行名1, 行名2, ...]]   # 如果有多行要引用,可以写到列表里

索引单个元素:

df.loc[行名, 列名]

使用布尔索引 (boolean indexing) 引用符合条件的值:

df[条件式]      # 仅引用满足条件表达式的数据

💬 用法演示:数据索引

import pandas as pd
names = ["Bob", "Jessica", "Mary", "John", "Kate"]
scores = [56, 11, 99, 83, 45]
members = {"Name": names, "Score": scores}
df = pd.DataFrame(data=members)
cgpa = pd.Series (
    [3.2, 2.5, 4.1, 2.8, 1.9]
)
df["Cgpa"] = cgpa
## 整体
print(df, "\n")
print("------ 列值引用 ------")
print(df[["Name", "Cgpa"]], "\n")
print("------ 切片引用 ------")
print(df[1 : 4], "\n")
print("------ 行引用 ------")
print(df.loc[[2, 4]], "\n")
print(df.loc[1, "Name"], "\n")
print("------ 布尔索引 ------")
print(df[df.Score > 60])          # 筛出分数大于60的


🚩 运行结果:

16bd2ad6d6cd22ab23fd9fedb6c34acb_4a6cd8d66c3546bd872bde2fe0413491.png



loc 指的是 location,iloc 中的 i 是指的是 integer,这两者的区别如下:

loc:根据实际设置的 index 来索引数据

iloc:根据顺序数字来索引数据

import pandas as pd
names = ["Bob", "Jessica", "Mary", "John", "Kate"]
scores = [56, 11, 99, 83, 45]
members = {"Name": names, "Score": scores}
df = pd.DataFrame(data = members, index = range(1, 6))
print(df, "\n")
## 与 df["Name"] 相同
print(df.loc[2], "\n")     
print(df.iloc[2], "\n")    
print(df.Name)

🚩 运行结果:

9af5d9b989e6cb311b39c3ec32cc54c4_a40e57043fbd4b40aaa2ead8afefd3f8.png



0x04 获取对数据进行排序的新对象

使用 DataFrame 对象的 sort_values(by=列名) 函数,按 by 参数指定的值排序(默认为升序)。


参数 ascending 值为 False 时,按降序排序。


根据引用,初始化 DataFrame 对象索引的新对象。


使用 reset_index() 函数获取初始化 DataFrame 对象索引的新对象。将参数 drop 值设置为 True 时为升序。


💬 用法演示:sort_values() 与 reset_index()

#P13
import pandas as pd
names = ["Bob", "Jessica", "Mary", "John", "Kate"]
scores = [56, 11, 99, 83, 45]
members = {"Name": names, "Score": scores}
df = pd.DataFrame(members)
df["Grade"] = ["C", "F", "A", "B", "D"]
df.loc[5] = ["Hanna", 90, "A"]
print(df, "\n")
## 创建按 "Score" 列降序排序的对象
df1 = df.sort_values(by = "Score", ascending = False) 
print(df1, "\n")
## 创建初始化 df1 对象索引的新对象
df2 = df1.reset_index(drop = True)
print(df2)


🚩 运行结果:

f37d89c654252c8c1361e0921fbbca70_93ba440690d94b5fa337542e1131bf59.png



0x05 DataFrame 为对象增加新列

缺失值处理:大多数实际数据都是未精炼的,存在缺失值,不同的数据具有不同形式的缺失值(缺失值)。结构性数据标记为 null、NaN、NA 等。

# p14
import pandas as pd
import numpy as np
names = ["Bob", "Jessica", "Mary", "John", "Kate"]
scores = [56, 11, 99, 83, 45]
members = {"Name": names, "Score": scores}
df = pd.DataFrame(members)
df["Grade"] = np.nan             # 不指定数据时只增加列
df.loc[2, "Grade"] = "A"         # 在现有行的追加的列中储存数据
df.loc[5, "Grade"] = "F"         # 追加新的行,在指定列中储存数据,剩下的数据以 Nan 形式初始化
print(df, "\n")

🚩 运行结果:

bb5d88611d263f1cb98d0f775fb8d1b1_b3c800cc9a0c44eabbbc6acc22057f96.png



💬 缺失值处理演示:

import pandas as pd
import numpy as np
a = np.array([1, 2, np.nan, 4, 5])
print(a, "\n")
print(a.sum(), a.min(), a.max())
print(np.nansum(a), np.nanmin(a), np.nanmax(a))  # 对非 nan 值计算

🚩 运行结果:

bd8380840c061c524e82ec9e0662702c_428992258ca645cd836c38f93bda0d0a.png



0x06 读取外部文件数据(CSV文件)

pandas 可以读取和写入各种外部数据,包括 CSV 文件、Excel 文件和文本文件。


读取CSV文件(扩展名 .csv)以创建并返回 DataFrame 对象的函数:

read_csv("文件名")

CSV 文件以逗号(,)分隔数据,并由表示记录的行和表示字段的列组成。


💬 用法演示:读取 csv 文件

import pandas as pd
pf = pd.read_scv("/content/test.csv")
print(pf, "\n")
pf1 = pd.read_scv("/content/test.csv", header = None)
print(pf1, "\n")

🚩 运行结果:

802269bbdc8b43ce0da9274f5e24759d_fcbe249889694c288220d83e87434796.png



将下面的 vehicle_prod.csv 文件保存到 colab 的工作文件夹 "/content" 文件夹中:

31b5311f23fe3ea1119000c6b576c560_dee64bba393647298e94a3020a031ce2.png

fc13a07145432a7fb7ec86b04094e0cb_2f6de6a811774aad8f112bc8b625f99c.png

(若要将第一行用作索引,省略第1行第1列的名称)


然后在 colab 中选择该文件,然后右键单击,将出现 "复制路径" 选项。

65e40b397ee7b63c99a4cfd8298730d7_7bb8c3c4565f42c5851779c23f556b01.png


💬 代码演示:读取 vehicle_prod.csv


import pandas as pd
import matplotlib.pyplot as plt
pf_f1 = pd.read_csv("/content/vehicle_prod.csv")
print(pf_f1, "\n")
## 将第0列设置为index
pf_f2 = pd.read_csv("/content/vehicle_prod.csv", index_col = 0)
print(pf_f2)
pf_f2["2007"].plot(kind='bar')   # 将列"2007"的数据可视化
plt.show()

🚩 运行结果:

d5cb423f490f5e1cbaf3330f8ff44871_6ac2fe353a90485e90693b8da0288c39.png

💬 代码演示:读取 vehicle_prod.csv 文件,按国家/地区绘制年度产量图:


import pandas as pd
import matplotlib.pyplot as plt
pf_f = pd.read_csv("/content/vehicle_prod.csv", index_col = 0)
plt.plot(pf_f.loc["China"])
plt.plot(pf_f.loc["EU"])
plt.plot(pf_f.loc["US"])
plt.plot(pf_f.loc["Japan"])
plt.plot(pf_f.loc["Korea"])
plt.plot(pf_f.loc["Mexico"])
plt.legend(["China", "EU", "US", "Japan", "Korea", "Mexico"])
plt.show()

🚩 运行结果:

21c6373c4bb78dc978d8b9a573fe7d37_3751a8fa5bc44e0a9e39eb725b51a76d.png


💬 代码演示:读取 vehicle_prod.csv 文件进行统计(总计,平均值)

import pandas as pd
import matplotlib.pyplot as plt
pf_f = pd.read_csv("/content/vehicle_prod.csv", index_col=0)
## 函数的参数axis=1表示列方向,axis=0表示行方向
pf_f["Total"] = pf_f.sum(axis=1)
pf_f["Average"] = pf_f[["2007", "2008", "2009", "2010", "2011"]].mean(axis=1)
print(pf_f, "\n")
## 追加列
pf_f["Average"].plot(kind='bar')
plt.show()
plt.bar(pf_f.index, pf_f["Average"])
plt.show()


🚩 运行结果:

9f62226254f42a5904f39a72e068557d_22af9af0b81b4ec88695ecc41f8bf4d0.png


相关文章
|
2月前
|
数据采集 数据可视化 数据挖掘
Pandas数据应用:天气数据分析
本文介绍如何使用 Pandas 进行天气数据分析。Pandas 是一个强大的 Python 数据处理库,适合处理表格型数据。文章涵盖加载天气数据、处理缺失值、转换数据类型、时间序列分析(如滚动平均和重采样)等内容,并解决常见报错如 SettingWithCopyWarning、KeyError 和 TypeError。通过这些方法,帮助用户更好地进行气候趋势预测和决策。
133 71
|
2月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
292 10
|
27天前
|
SQL 数据可视化 大数据
从数据小白到大数据达人:一步步成为数据分析专家
从数据小白到大数据达人:一步步成为数据分析专家
210 92
|
30天前
|
测试技术 数据库 Python
Python装饰器实战:打造高效性能计时工具
在数据分析中,处理大规模数据时,分析代码性能至关重要。本文介绍如何使用Python装饰器实现性能计时工具,在不改变现有代码的基础上,方便快速地测试函数执行时间。该方法具有侵入性小、复用性强、灵活度高等优点,有助于快速发现性能瓶颈并优化代码。通过设置循环次数参数,可以更准确地评估函数的平均执行时间,提升开发效率。
103 61
Python装饰器实战:打造高效性能计时工具
|
2天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
21 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
23 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
4天前
|
数据采集 数据安全/隐私保护 Python
从零开始:用Python爬取网站的汽车品牌和价格数据
在现代化办公室中,工程师小李和产品经理小张讨论如何获取懂车帝网站的汽车品牌和价格数据。小李提出使用Python编写爬虫,并通过亿牛云爬虫代理避免被封禁。代码实现包括设置代理、请求头、解析网页内容、多线程爬取等步骤,确保高效且稳定地抓取数据。小张表示理解并准备按照指导操作。
从零开始:用Python爬取网站的汽车品牌和价格数据
|
1月前
|
数据可视化 算法 数据挖掘
Python时间序列分析工具Aeon使用指南
**Aeon** 是一个遵循 scikit-learn API 风格的开源 Python 库,专注于时间序列处理。它提供了分类、回归、聚类、预测建模和数据预处理等功能模块,支持多种算法和自定义距离度量。Aeon 活跃开发并持续更新至2024年,与 pandas 1.4.0 版本兼容,内置可视化工具,适合数据探索和基础分析任务。尽管在高级功能和性能优化方面有提升空间,但其简洁的 API 和完整的基础功能使其成为时间序列分析的有效工具。
79 37
Python时间序列分析工具Aeon使用指南
|
2月前
|
存储 数据采集 数据可视化
Pandas数据应用:电子商务数据分析
本文介绍如何使用 Pandas 进行电子商务数据分析,涵盖数据加载、清洗、预处理、分析与可视化。通过 `read_csv` 等函数加载数据,利用 `info()` 和 `describe()` 探索数据结构和统计信息。针对常见问题如缺失值、重复记录、异常值等,提供解决方案,如 `dropna()`、`drop_duplicates()` 和正则表达式处理。结合 Matplotlib 等库实现数据可视化,探讨内存不足和性能瓶颈的应对方法,并总结常见报错及解决策略,帮助提升电商企业的数据分析能力。
152 73
|
2月前
|
存储 数据挖掘 数据处理
掌握Pandas核心数据结构:Series与DataFrame的四种创建方式
本文介绍了 Pandas 库中核心数据结构 Series 和 DataFrame 的四种创建方法,包括从列表、字典、标量和 NumPy 数组创建 Series,以及从字典、列表的列表、NumPy 数组和 Series 字典创建 DataFrame,通过示例详细说明了每种创建方式的具体应用。
209 67

热门文章

最新文章