Python Pandas

🍦 Pandas既指Panel Data,又指Data Analysis,具有分析、清理、探索数据等功能,由Wes McKinney于2008年创建。

1 Pandas

  • Pandas
    • 命令窗口下使用pip install pandas进行安装。
    • 通过import关键字将其导入应用程序,通常以pd别名替代。
    • 检查Pandas版本,版本字符串存储在__version__属性下。
1
2
3
4
5
6
7
8
9
10
11
import pandas as pd                 # 导入时使用关键字别名

dataset = {
"cars": ["BMW", "Volvo", "Ford"],
"passing": [3, 7, 2]
}
var = pd.DataFrame(dataset)
print(var)
print("-----------------")

print(pd.__version__) # 检查Pandas版本

2 创建系列

  • 创建系列
    • Pandas Series就像表格中的一列,是一个保存任何类型数据的一维数组。
    • 若未指定其他内容,使用索引号标记值,第一个值索引为0,第二个为1,以此类推。
    • index参数创建自定义标签,创建系列时还可用键值对象,同理index参数指定标签。
    • Pandas中的数据集通常是多维表,即DataFrames,Series是列,DataFrame就是表。
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
import pandas as pd

set = [1, 5, 3]
var = pd.Series(set)
print(var)
print(var[0]) # 返回Series的第一个值
print("------------")

var = pd.Series(set, index=["x", "y", "z"])
print(var) # 创建自定义标签
print(var["y"]) # 返回标签为y的值
print("------------")

dic = {"day1": 420, "day2": 260, "day3": 300}
var = pd.Series(dic) # 从字典创建一个简单的Pandas系列
print(var) # 字典的键成为标签
print("------------")
var = pd.Series(dic, index=["day1", "day2"])
print(var)
print("------------")

dat = {
"cal": [210, 260, 300],
"dur": [50, 30, 10]
}
var = pd.DataFrame(dat) # 从两个系列创建一个数据框DataFrame
print(var)

3 DataFrame

  • DataFrame
    • 一种二维数据结构,例如二维数组或具有行和列的表。
    • 使用loc属性返回一个或多个指定行,index参数自定义索引。
    • 若数据集存储在文件中,Pandas可将其加载到DataFrame中。
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
import pandas as pd

dat = {
"cal": [210, 260, 300],
"dur": [50, 30, 10]
}
var = pd.DataFrame(dat) # 从两个系列创建一个数据框DataFrame
print(var)
print("------------------------")
print(var.loc[0]) # 返回第0行,返回Pandas Series
print("------------------------")
print(var.loc[[0, 1]]) # 返回第0行和第1行,返回Pandas DataFrame
print("------------------------")

var = pd.DataFrame(dat, index=["day1", "day2", "day3"])
print(var) # 添加名称列表给每行命令
print("------------------------")
print(var.loc["day2"]) # 索引返回指定的行
print("------------------------")

""" data/demension_data.csv
Language Number
Python 50
Java 120
Golang 112
C++ 155
C# 110
C 78
JavaScript 99
HTML 35
CSS 45
PHP 75
React 15
R 25
"""
df = pd.read_csv(r"data/demension_data.csv")
print(df) # 文件数据集加载到DataFrame中,注意文件路径

3-1 读取CSV

  • 读取CSV
    • to_string():用于打印整个DataFrame。
    • 若包含多行的大型DataFrame,Pandas将只返回前5行和最后5行。
    • 可使用pd.options.display.max_rows语句检查系统的最大行数。
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
import pandas as pd

""" data/demension_data.csv
Language Number
Python 50
Java 120
Golang 112
C++ 155
C# 110
C 78
JavaScript 99
HTML 35
CSS 45
PHP 75
React 15
R 25
"""
df = pd.read_csv(r"data/demension_data.csv")
print(df.to_string()) # 文件数据集加载到DataFrame中,注意文件路径
print("----------------------")
print(pd.options.display.max_rows) # 检查返回的最大行数
print("----------------------")

pd.options.display.max_rows = 5
df = pd.read_csv(r"data/demension_data.csv")
print(df) # 更改最大行数,只显示五行

3-2 读取JSON

  • 读取JSON
    • to_string():用于打印整个DataFrame,JSON对象具有与字典相同的格式。
    • 若JSON代码不在文件中在Python字典里,则可直接将其加载到DataFrame中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd

""" data/demension_data.json
{
"Duration": { "0": 60, "1": 60, "2": 60, "3": 45, "4": 45, "5": 60 },
"Pulse": { "0": 110, "1": 117, "2": 103, "3": 109, "4": 117, "5": 102 },
"Maxpulse": { "0": 130, "1": 145, "2": 135, "3": 175, "4": 148, "5": 127 }
}
"""
df = pd.read_json(r"data/demension_data.json")
print(df.to_string()) # 文件数据集加载到DataFrame中,注意文件路径
print("----------------------------")

data = {
"Duration": {"0": 71, "1": 73, "2": 75},
"Pulse": {"0": 30, "1": 35, "2": 37},
"Calories": {"0": 55, "1": 57, "2": 59}
}
df = pd.DataFrame(data) # Python字典加载到DataFrame中
print(df)

4 分析数据

  • 分析数据
    • head():从顶部开始返回标题和指定数量的行,不指定行数时默认返回前5行。
    • tail():从底部开始返回标题和指定数量的行,不指定行数时默认返回后5行。
    • info():打印有关数据的信息,返回RangeIndex行数和Columns列数、每列名称和数据类型。
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
import pandas as pd

""" data/demension_data.csv
Language Number
Python 50
Java 120
Golang 112
C++ 155
C# 110
C 78
JavaScript 99
HTML 35
CSS 45
PHP 75
React 15
R 25
"""
df = pd.read_csv(r"data/demension_data.csv")
print(df.head()) # 打印前5行
print("-------------------------------------")
print(df.head(3)) # 打印前3行
print("-------------------------------------")
print(df.tail()) # 打印后5行
print("-------------------------------------")
print(df.tail(3)) # 打印后3行
print("-------------------------------------")
print(df.info()) # 打印有关数据的信息

5 清理数据

  • 清理数据
    • 清理意味着修复数据集中的不良数据,可能是空单元格、数据格式错误、错误数据或重复数据。
    • dropna():删除包含空单元格的行,返回新DataFrame且不改变原来的,inplace参数可以改变。
    • fillna():允许用一个值替换空单元格,通过指定DataFrame的列名,可以替换指定列的空值。
    • 平均值mean()、中位数median()和众数mode()方法计算指定列的相应值,用于替换空单元格。
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
38
39
40
41
42
43
44
45
46
import numpy as np
import pandas as pd

data1 = data2 = data3 = data4 = data5 = data6 = {
"Duration": {"0": 60, "1": 45, "2": 45, "3": 60},
"Date": {"0": "2020/12/21", "1": np.NaN, "2": "2020/12/18", "3": "2020/12/28"},
"Pulse": {"0": 108, "1": 100, "2": 90, "3": 103},
"Maxpulse": {"0": 131, "1": 119, "2": 112, "3": 132},
"Calories": {"0": 364.2, "1": 282.0, "2": np.NaN, "3": np.NaN}
}
df = pd.DataFrame(data1) # Python字典加载到DataFrame中
new_df = df.dropna() # 返回没有空单元格的DataFrame
print(new_df.to_string())
print("--------------------------------------------------")
print(df.to_string())
print("--------------------------------------------------")
df.dropna(inplace=True) # 改变原始DataFrame
print(df.to_string())
print("--------------------------------------------------")

df = pd.DataFrame(data2)
df.fillna(120, inplace=True) # 数字120替换NULL值
print(df.to_string())
print("--------------------------------------------------")

df = pd.DataFrame(data3)
df["Calories"].fillna(150, inplace=True)
print(df.to_string()) # 替换指定列的NULL值
print("--------------------------------------------------")

df = pd.DataFrame(data4)
dx = df["Calories"].mean() # 计算平均值,并替换空值
df["Calories"].fillna(dx, inplace=True)
print(df.to_string())
print("--------------------------------------------------")

df = pd.DataFrame(data5)
dx = df["Calories"].median() # 计算中位数,并替换空值
df["Calories"].fillna(dx, inplace=True)
print(df.to_string())
print("--------------------------------------------------")

df = pd.DataFrame(data6)
dx = df["Calories"].mode()[0] # 计算众数,并替换空值
df["Calories"].fillna(dx, inplace=True)
print(df.to_string())

5-1 错误格式

  • 错误格式
    • 删除相应行,或将列中的所有单元格转换为相同格式。
    • to_datetime():将列中的日期元素转换为日期格式。
    • dropna():NaT值即空日期,可将其处理为NULL值,删除对应行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np
import pandas as pd

data1 = data2 = {
"Duration": {"0": 45, "1": 60, "2": 45, "3": 60},
"Date": {"0": np.NaN, "1": "2020/12/23", "2": "2020/12/24", "3": 20201226},
"Pulse": {"0": 100, "1": 130, "2": 105, "3": 100},
"Maxpulse": {"0": 119, "1": 101, "2": 132, "3": 120},
"Calories": {"0": 282.0, "1": 300.0, "2": 246.0, "3": 250.0}
}
df = pd.DataFrame(data1) # Python字典加载到DataFrame中
df["Date"] = pd.to_datetime(df["Date"])
print(df.to_string()) # 转换为日期
print("--------------------------------------------------------------------")

df = pd.DataFrame(data2)
df.dropna(subset=["Date"], inplace=True)
print(df.to_string()) # 删除日期为NULL值的行

5-2 错误数据

  • 错误数据
    • 错误数据不一定是空单元格或错误格式,也可能只是错误的。
    • 错误数据可能是拼写错误,可以在对应行插入数据进行替换。
    • 另一种处理方法就是使用drop()方法删除包含错误数据的行。
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
import pandas as pd

""" data/erroneous_data.csv
Duration Date Pulse Maxpulse Calories
60 2020/12/01 110 130 409.1
60 2020/12/02 117 145 479.0
600 2020/12/03 103 135 340.0
45 2020/12/04 109 175 282.4
450 2020/12/05 117 148 406.0
60 2020/12/06 102 127 300.0
60 2020/12/07 110 136 374.0
30 2020/12/09 109 133 195.1
"""
df = pd.read_csv("data/erroneous_data.csv")
df.loc[2, "Duration"] = 50 # 第2行Duration设置为50
print(df.to_string())
print("-------------------------------------------------")

df = pd.read_csv("data/erroneous_data.csv")
for x in df.index: # 若是大数据集替换,可创建一些规则
if df.loc[x, "Duration"] > 100:
df.loc[x, "Duration"] = 100
print(df.to_string())
print("-------------------------------------------------")

df = pd.read_csv("data/erroneous_data.csv")
for x in df.index: # 创建规则,删除行
if df.loc[x, "Duration"] > 50:
df.drop(x, inplace=True)
print(df.to_string())

5-3 重复数据

  • 重复数据
    • duplicated():为每一行返回一个布尔值,重复将返回True,否则为False。
    • drop_duplicates():删除重复项,inplace参数会从原始DataFrame中删除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

""" data/duplicate_data.csv
Duration Date Pulse Maxpulse Calories
65 2020/12/01 110 130 409.1
60 2020/12/02 117 145 479.0
60 2020/12/02 117 145 479.0
45 2020/12/04 109 175 282.4
45 2020/12/05 117 148 406.0
60 2020/12/06 102 127 300.0
60 2020/12/07 110 136 374.0
30 2020/12/09 109 133 195.1
"""
df = pd.read_csv(r"data/duplicate_data.csv")
print(df.duplicated()) # 重复的行将返回True,否则为False
print("-------------------------------------------------")

df.drop_duplicates(inplace=True)
print(df.to_string())

6 数据相关性

  • 数据相关性
    • corr():计算数据集中每一列之间的关系,该方法将忽略非数字列。
    • 返回结果是一个包含大量数字的表格,这些数字表示两列之间的关系。
    • 数字从-1到1不等。
      • 1完全相关,数据集中,每次第一列的值上升,另一个值也会上升。
      • 0.9表示数据良好相关,增加一个值,另一个可能也会增加。
      • -0.9也是数据良好相关,增加一个值,另一个可能会下降。
      • 0.2表示不良相关,意味着如果一个值上升,另一个值不一定上升。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pandas as pd

""" data/dependency_data.csv
Duration Pulse Maxpulse Calories
60 110 130 409.1
60 117 145 479.0
60 103 135 340.0
45 109 175 282.4
45 117 148 406.0
60 102 127 300.0
60 110 136 374.0
45 104 134 253.3
30 109 133 195.1
60 98 124 269.0
"""
df = pd.read_csv(r"data/dependency_data.csv")
print(df.to_string())
print("------------------------------------------------")
print(df.corr()) # 显示列之间的关系

7 可视化图表

  • 可视化图表
    • plot()方法创建图表,也可以使用Matplotlib库的子模块Pyplot创建。
    • 直方图:指定参数kind="hist",并且只需要一列。
    • 散点图:指定参数kind="scatter",并需x轴和y轴。
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
import pandas as pd
import matplotlib.pyplot as plt # 从Matplotlib导入pyplot

""" data/dependency_data.csv
Duration Pulse Maxpulse Calories
60 110 130 409.1
60 117 145 479.0
60 103 135 340.0
45 109 175 282.4
45 117 148 406.0
60 102 127 300.0
60 110 136 374.0
45 104 134 253.3
30 109 133 195.1
60 98 124 269.0
"""
df = pd.read_csv(r"data/dependency_data.csv")
df.plot()
plt.show()

df["Duration"].plot(kind="hist")
plt.show() # 直方图

df.plot(kind="scatter", x="Duration", y="Calories")
plt.show() # 散点图

Python Pandas
https://stitch-top.github.io/2021/06/08/python/python07-python-pandas/
作者
Dr.626
发布于
2021年6月8日 22:33:30
许可协议