本篇文章所依据是蚂蚁学Python作者讲解所写,且已征求作者的同意,内容基本都是视频中所讲的内容。视频满满的全是干货,也可一边看视频一边配合着本篇文章。
作者的公众号:蚂蚁学Python
作者也提供了代码和课件,在视频的评论区就能找到。本篇文章的代码也可以参考,如有需要,可以私聊发送。
本篇文章有两章没有写完,之后会补充完整。
本篇文章目录
- 一、前言
- 二、什么是pandas
- 三、pandas安装
- 四、pandas的常用数据类型
- 五、数据的读取
- 六、数据的查询
- 七、新增数据列
- 八、pandas数据统计函数
- 九、缺失值的处理
- 十、 SettingWithCopyWarning报警
- 十一、Pandas数据排序
- 十二、Pandas字符串处理
- 十三、Pandas的axis参数
- 十四、Pandas的索引index的用途
- 十五、Pandas怎样实现Merge
- 十六、Pandas实现数据的合并concat
- 十七、Pandas批量拆分与合并
- 十八、Pandas怎样实现groupby分组统计
- 十九、Pandas的分层索引Multilndex
- 二十、Pandas的map-apply-applymap数据转换
- 二十一、Pandas实现groupby每个分组的apply
- 二十二、pandas使用stock和pivot实现数据透视
- 二十三、Pandas快速实现周,月,季度的日期聚合统计
- 二十四、Pandas处理日期索引的缺失
- 二十五、Pandas实现Excel的vlookup在指定列后面输出
- 二十六、Pandas读取Excel并绘制图像
- 二十七、Pandas结合Sklearn实现机器学习
- 二十八、Pandas实现原始网站日志处理与分析
- 二十九、Pandas查询数据的简便方法
- 三十、Pandas按行遍历DataFrame的3种方法
一、前言
Numpy能够帮助我们处理数值型数据,但这是远远不够的,很多时候,我们需要处理的数据中不仅仅时数值型数据,还有字符串,时间序列等等。所以Numpy能够帮助我们处理数值,但是pandas除了梳理数值之外(基于Numpy),还能构帮助我们处理其他类型的数据。
二、什么是pandas
一个开源的python类库:用于数据分析、数据处理、数据可视化
- 特点:高性能,容易使用的数据结构,容易使用的数据分析工具
三、pandas安装
pip install pandas
四、pandas的常用数据类型
4.1 series:表示一维,带标签数组,一行或一列
4.1.1创建series
示例代码:
import pandas as pd
# 创建一个Series
t = pd.Series([1, 2, 'p', 3, 'a'])
# 输出的结果,左侧为索引,右侧为数据
print(t)
输出结果:
0 1
1 2
2 p
3 3
4 a
dtype: object
4.1.2 打印索引值
通过index则可以打印出索引值
示例代码:
import pandas as pd
# 创建一个Series
t = pd.Series([1, 2, 'p', 3, 'a'])
# 打印索引值
print(t.index)
输出结果:
RangeIndex(start=0, stop=5, step=1)
4.1.3 打印数据值
通过values可以获得我们数据值
示例代码:
import pandas as pd
# 创建一个Series
t = pd.Series([1, 2, 'p', 3, 'a'])
# 打印数据值
print(t.values)
输出结果:
[1 2 'p' 3 'a']
4.1.3 创建一个具有标签索引的series
指定index则会创建一个具有标签索引的serie
示例代码:
import pandas as pd
# 创建一个具有标签索引的series
f = pd.Series([1, 2, 'p', 3, 'a'], index=[11, 22, 33, 44, 55])
print(f)
输出结果:
11 1
22 2
33 p
44 3
55 a
dtype: object
4.1.4 使用python字典创建series
示例代码:
import pandas as pd
data = {
"name": "tom", "gender": "man", "age": 18}
g = pd.Series(data)
print(g)
输出结果:
name tom
gender man
age 18
dtype: object
4.1.5 根据索引值查询数据
- 查询单个数据与字典查询数据类似方法
示例代码:
import pandas as pd
f = pd.Series([1, 2, 'p', 3, 'a'], index=[11, 22, 33, 44, 55])
# 使用索引值查询数据
print(f[11])
输出结果:
1
- 查询多个数据
示例代码:
import pandas as pd
f = pd.Series([1, 2, 'p', 3, 'a'], index=[11, 22, 33, 44, 55])
# 使用索引值查询多个数据
print(f[[11, 22]])
输出结果:
11 1
22 2
dtype: object
4.2 DataFrame:表示二维,多行多列
DataFrame是一个表格型的数据结构
- 每列可以是不同值的类型(数值,字符串,布尔值等)
- 既有行索引index,也有列索引columns
- 可以被看做由Series组成的字典
4.2.1DataFrame创建
4.2.1.1 根据字典创建DataFrame
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df)
输出结果:
name age gender
0 Tom 12 man
1 rose 21 woman
2 json 23 man
4.2.1.2 查看类型
调用dtypes方法可查看我们的数据每一列的数据类型
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df.dtypes)
输出如果:
name object
age int64
gender object
dtype: object
4.2.1.3 查看列索引
通过columns方法可以查看我们数据的列索引
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df.columns)
输出结果:
Index(['name', 'age', 'gender'], dtype='object')
4.2.1.4 查看行索引
通过index方法可以查看我们数据的列索引
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df.index)
输出结果:
RangeIndex(start=0, stop=3, step=1)
4.2.2 从DataFrame中查询Series
- 如果只查询一行、一列、返回的是pd.Series
- 如果查询多行、多列,返回的是pd.DataFrame
4.2.2.1 查询一列,结果是一个pd.Series
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df)
输出结果:
name age gender
0 Tom 12 man
1 rose 21 woman
2 json 23 man
print(df["name"])
输出结果:
0 Tom
1 rose
2 json
Name: name, dtype: object
4.2.2.2 查询多列,结果是一个pd.DataFrame
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df)
输出结果:
name age gender
0 Tom 12 man
1 rose 21 woman
2 json 23 man
print(df[["name","age"]])
输出结果:
name age
0 Tom 12
1 rose 21
2 json 23
print(type(df[["name","age"]]))
输出结果“
<class 'pandas.core.frame.DataFrame'>
4.2.2.3 查询一行,结果是一个pd.Series
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df)
输出结果:
name age gender
0 Tom 12 man
1 rose 21 woman
2 json 23 man
# 查询一行
print(df.loc[1])
输出结果:
name rose
age 21
gender woman
Name: 1, dtype: object
4.2.2.4 查询多行,结果是一个pd.DataFrame
示例代码:
import pandas as pd
# 根据字典创建DataFrame
data = {
"name": ["Tom", "rose", "json"],
"age": [12, 21, 23],
"gender": ["man", "woman", "man"]
}
# 调用DataFrame方法
df = pd.DataFrame(data)
print(df)
输出结果:
name age gender
0 Tom 12 man
1 rose 21 woman
2 json 23 man
# 查询多行
print(df.loc[0:1])
输出结果:
name age gender
0 Tom 12 man
1 rose 21 woman
五、数据的读取
5.1 常用数据格式读取方式
5.2 pandas读取csv文件
pandas读取csv文件通过调用read_csv即可。
5.2.1 读取整篇文件
示例代码:
import pandas as pd
t = pd.read_csv("proxy.csv")
print(t)
5.2.2 pandas读取前几行
通过head()方法,可以读取csv文件中的前几行内容。
示例代码:
import pandas as pd
t = pd.read_csv("proxy.csv")
print(t.head())
输出结果:
5.2.3 pandas查看数据的形状,返回(行数、列数)
通过.shape方法,可查看csv文件的形状。
示例代码:
import pandas as pd
t = pd.read_csv("proxy.csv")
print(t.shape)
输出结果:
(9999, 1)
5.2.4 pandas查看列名列表
import pandas as pd
t = pd.read_csv("proxy.csv")
# 查看列名列表
print(t.columns)
输出结果:
Index(['http://106.122.205.38:8118'], dtype='object')
5.2.5 pandas查看索引列
import pandas as pd
t = pd.read_csv("proxy.csv")
# 查看索引列
print(t.index)
输出结果:
RangeIndex(start=0, stop=9999, step=1)
5.2.6 pandas查看数据类型
import pandas as pd
t = pd.read_csv("proxy.csv")
# 查看数据类型
print(t.dtypes)
输出结果:
http://106.122.205.38:8118 object
dtype: object
5.3 pandas读取txt文件
5.4 pandas读取excel文件
示例代码:
import pandas as pd
f = pd.read_excel("pandas数据读取.xlsx")
print(f)
输出结果:
5.5 pandas读取mysql文件
六、数据的查询
6.1 pandas查询数据的几种方式
- df.loc方法,根据行、列的标签值查询
- df.iloc方法,根据行、列的数字位置进行查询
- df.where方法
- df.query方法
.loc方法既能查询,又能覆盖写入
6.2 pandas使用loc查询数据
- 使用单个标签值查询数据
- 使用值列表批量查询
- 使用数值区间进行范围查询
- 使用条件表达式查询
- 调用函数查询
注意:以上查询方法,既适合行也适合列。注意观察降维DataFrame > Series > 值
6.2.1 使用单个Label值查询数据
行或者列,都可以只传入单个值,实现精确匹配
查询单个值:
import pandas as pd
df = pd.read_csv("weather.csv", encoding="gbk")
# 设置以年月日为索引
df.set_index("ymd", inplace=True)
# 将℃替换为空
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
# 打印前几行
print(df.head())
输出结果:
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2020/3/1 13 5 多云~晴 东北风 2级 72 良 2
2020/3/2 10 1 阴~多云 东南风 2级 71 良 2
2020/3/3 14 1 阴~晴 东北风 2级 63 良 2
2020/3/4 15 2 多云 东北风 2级 86 良 2
2020/3/5 16 6 多云 东南风 2级 80 良 2
# 查询单个值
single = df.loc["2020/3/1", "bWendu"]
print(single)
输出结果:
13
得到一个Series:
import pandas as pd
df = pd.read_csv("weather.csv", encoding="gbk")
# 设置以年月日为索引
df.set_index("ymd", inplace=True)
# 将℃替换为空
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
# 打印前几行
print(df.head())
输出结果:
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2020/3/1 13 5 多云~晴 东北风 2级 72 良 2
2020/3/2 10 1 阴~多云 东南风 2级 71 良 2
2020/3/3 14 1 阴~晴 东北风 2级 63 良 2
2020/3/4 15 2 多云 东北风 2级 86 良 2
2020/3/5 16 6 多云 东南风 2级 80 良 2
# 得到一个Series
series = df.loc["2020/3/4", ["bWendu", "yWendu"]]
print(series)
输出结果:
bWendu 15
yWendu 2
Name: 2020/3/4, dtype: object
6.2.2 使用值列表批量查询数据
得到一个Series,通过传入一行多列或者多行一列即可得到Series
import pandas as pd
df = pd.read_csv("weather.csv", encoding="gbk")
# 设置以年月日为索引
df.set_index("ymd", inplace=True)
# 将℃替换为空
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
# 打印前几行
print(df.head())
输出结果:
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2020/3/1 13 5 多云~晴 东北风 2级 72 良 2
2020/3/2 10 1 阴~多云 东南风 2级 71 良 2
2020/3/3 14 1 阴~晴 东北风 2级 63 良 2
2020/3/4 15 2 多云 东北风 2级 86 良 2
2020/3/5 16 6 多云 东南风 2级 80 良 2
# 得到一个Series,通过传入一行多列或者多行一列即可得到Series
ser = df.loc[['2020/3/1', '2020/3/2', '2020/3/3'], 'bWendu']
print(ser)
输出结果:
ymd
2020/3/1 13
2020/3/2 10
2020/3/3 14
Name: bWendu, dtype: int32
得到一个DataFrame,通过行和列都传入一个列表即可得到一个DataFrame
import pandas as pd
df = pd.read_csv("weather.csv", encoding="gbk")
# 设置以年月日为索引
df.set_index("ymd", inplace=True)
# 将℃替换为空
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
# 打印前几行
print(df.head())
输出结果:
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2020/3/1 13 5 多云~晴 东北风 2级 72 良 2
2020/3/2 10 1 阴~多云 东南风 2级 71 良 2
2020/3/3 14 1 阴~晴 东北风 2级 63 良 2
2020/3/4 15 2 多云 东北风 2级 86 良 2
2020/3/5 16 6 多云 东南风 2级 80 良 2
# 得到一个DataFrame,通过行和列都传入一个列表即可得到一个DataFrame
data = df.loc[['2020/3/1', '2020/3/2', '2020/3/3'],['bWendu', 'yWendu']]
print(data)
6.2.3 使用数值区间进行范围查询数据
注意:区间既包括开始,也包括结束
行index按区间,Series类型
import pandas as pd
df = pd.read_csv("weather.csv", encoding="gbk")
# 设置以年月日为索引
df.set_index("ymd", inplace=True)
# 将℃替换为空
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
# 打印前几行
print(df.head())
输出结果:
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2020/3/1 13 5 多云~晴 东北风 2级 72 良 2
2020/3/2 10 1 阴~多云 东南风 2级 71 良 2
2020/3/3 14 1 阴~晴 东北风 2级 63 良 2
2020/3/4 15 2 多云 东北风 2级 86 良 2
2020/3/5 16 6 多云 东南风 2级 80 良 2
# 行index按区间
num = df.loc['2020/3/1':'2020/3/2', 'bWendu']
print(num)
输出结果:
ymd
2020/3/1 13
2020/3/2 10
Name: bWendu, dtype: int32
列index按区间,Series类型
import pandas as pd
df = pd.read_csv("weather.csv", encoding="gbk")
# 设置以年月日为索引
df.set_index("ymd", inplace=True)
# 将℃替换为空
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
# 打印前几行
print(df.head())
输出结果:
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2020/3/1 13 5 多云~晴 东北风 2级 72 良 2
2020/