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
47
48
49
50
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)
df["Calories"] = df["Calories"].fillna(150)
print(df.to_string()) # 替换指定列的NULL值
print("--------------------------------------------------")

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

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

df = pd.DataFrame(data6)
dx = df["Calories"].mode()[0] # 计算众数,并替换空值
# df["Calories"].fillna(dx, inplace=True)
df["Calories"] = df["Calories"].fillna(dx)
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
19
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"])
df["Date"] = pd.to_datetime(df["Date"], format="mixed")
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
许可协议