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
- 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
- 点赞
- 收藏
- 关注作者
评论(0)