什么是Pandas?
如今随着人工智能、大数据、和机器学习的崛起,处理数据相关的工具百花齐发。而Python作为现今数据领域中的龙头老大,其中有3个和数据处理相关的库最受欢迎,它们分别是NumPy、Pandas和MatplotLib。
NumPy可以帮助我们更方便地处理数组,也能更快地进行矩阵运算,想要学习的朋友可以查看我们的《NumPy入门教程》。而Pandas是以NumPy为基础的另一个库,它继承了NumPy的高效率和便利性,能直接将csv文件中的数据转换成DataFrame进行处理,Pandas还提供了很多专门用来分析Time Series和Categorical数据类型的函数,帮助我们更方便有效地进行数据分析。而MatplotLib可以帮助我们实现数据可视化,我们未来也会出相应的教程。
这一章,我们就通过一些简单的例子,尝点用Pandas处理数据的甜头,之后的章节再继续深入其常用的函数。
Pandas 初体验
如果要使用 Pandas,首先使用Python包管理器pip安装pandas:
pip3 install pandas
然后在notebook中导入pandas,因为numpy和pandas常常会被同时使用,所以最好一并将numpy和pandas一起导入:
import numpy as np
import pandas as pd
那我们先来学习一下如何使用Pandas创建DataFrame。DataFrame是一种二维的、类似表格的数据结构,可以简单地将其理解为关系数据库中的表格,每一行都有对应的index,而每一列都有对应的header,不同列的数据类型也可以不同:
data_dict = {
'name': ['David', 'Tim', 'Alice'],
'age': [19, 23, 22]
}
pandas_df = pd.DataFrame(data_dict)
在这个例子中,我们就创建一个由两列(name和age)组成的dataframe,而每一行代表一个学生的信息。如果我们将其打印出来,结果就像是一张表格:
print(pandas_df)
name age
0 David 19
1 Tim 23
2 Alice 22
我们也可以结合NumPy的功能为Dataframe创建数据,以下就使用了NumPy为DataFrame创建了两列随机数,分别代表年龄和分数:
df = pd.DataFrame(columns = ['age', 'score'])
df['score'] = np.random.randint(100, size=(10)) # 0~99的随机整数
df['age'] = np.random.randint(25, size=(10)) # 0~24的随机整数
print(df)
age score
0 20 10
1 11 12
2 23 88
3 17 10
4 4 36
5 24 45
6 6 89
7 8 54
8 14 47
9 4 72
我们也能将DataFrame的数据可视化,因为Pandas的底层有使用MatplotLib,如果我们想要画出年龄和分数相对应的散点图,可以使用plot函数快速出图:
df.plot(x = 'age', y = 'score', kind = 'scatter')
如果想要将DataFrame按特定列进行排序,直接使用sort_values函数即可:
sorted_df = df.sort_values(by=['age'])
sorted_df
age score
4 4 36
9 4 72
6 6 89
7 8 54
1 11 12
8 14 47
3 17 10
0 20 10
2 23 88
5 24 45
这样每一行都会按照age从小到大排好序,此时再画出折线图就能看出年龄和分数的对应关系啦:
sorted_df.plot(x = 'age', y = 'score')
如果将DataFrame中地数据存储起来也很简单,直接使用to_csv函数将DataFrame导入csv文件,而read_csv函数也能很方便地帮助我们读取csv文件中的内容:
# Store a dataframe in a csv file
sorted_df.to_csv('pd_df.csv', index = False)
# Load a dataframe from csv
local_df = pd.read_csv('pd_df.csv')
print(local_df)
我们甚至还能直接通过url从互联网中读取csv文件,比如以下这个url中(https://raw.githubusercontent.com/turingplanet/pandas-intro/main/public-datasets/iris.csv)就存储了和鸢尾花(iris)相关的数据集,我们可以直接从其中读取数据并生成dataframe:
data_url = 'https://raw.githubusercontent.com/turingplanet/pandas-intro/main/public-datasets/iris.csv'
iris_data_df = pd.read_csv(data_url)
print(iris_data_df)
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
iris_data_df.shape # (150, 5)
这个数据集中包含了不同花样本的物理属性和品种,如果想要进一步了解数据的分布,可以选取四种属性,并通过plot函数将其可视化:
iris_data_df[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']].plot()
如果想要对其中的数据进行更深入的挖掘,可以直接使用pandas自带的两个函数:info和descrbie,info可以获取每一列数据的基本信息,而describe可以计算出每一列数据相关的统计结果:
print(iris_data_df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal_length 150 non-null float64
1 sepal_width 150 non-null float64
2 petal_length 150 non-null float64
3 petal_width 150 non-null float64
4 species 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
iris_data_df.describe(include='all')
sepal_length sepal_width petal_length petal_width species
count 150.0 150.000000 150.000000 150.000000 150
unique NaN NaN NaN NaN 3
top NaN NaN NaN NaN versicolor
freq NaN NaN NaN NaN 50
mean 100.0 3.057333 3.758000 1.199333 NaN
std 0.0 0.435866 1.765298 0.762238 NaN
min 100.0 2.000000 1.000000 0.100000 NaN
25% 100.0 2.800000 1.600000 0.300000 NaN
50% 100.0 3.000000 4.350000 1.300000 NaN
75% 100.0 3.300000 5.100000 1.800000 NaN
max 100.0 4.400000 6.900000 2.500000 NaN
对DataFrame中的数据进行操作很方便,如下,我们就能直接将sepal_length列全变为空:
iris_data_df['sepal_length'] = np.nan
print(iris_data_df)
sepal_length sepal_width ... species ksepal_length
0 5.1 3.5 ... setosa NaN
1 4.9 3.0 ... setosa NaN
2 4.7 3.2 ... setosa NaN
3 4.6 3.1 ... setosa NaN
4 5.0 3.6 ... setosa NaN
.. ... ... ... ... ...
145 6.7 3.0 ... virginica NaN
146 6.3 2.5 ... virginica NaN
147 6.5 3.0 ... virginica NaN
148 6.2 3.4 ... virginica NaN
149 5.9 3.0 ... virginica NaN
Pandas中包含了很多处理数据的函数,比如以下这个fillna函数,就能将为dataframe中所有为空的地方填上特定的数值:
iris_data_df.fillna(100, inplace = True) # 把空值都填为100
print(iris_data_df)
iris_data_df.head()
Pandas中也包含了很多常用的统计函数,以下的mean就能计算出特定列的平均数:
print(iris_data_df['petal_length'].mean()) # 3.7580000000000027
好了,以上就是Pandas的基本展示了。当然了,这些功能只是Pandas的冰山一角,作为处理数据的神器,Pandas的威力绝对超乎你的想象。
《Pandas入门教程》大纲
作为初学者,掌握其中最常用的函数是最务实的学习方式,实现原理和奇技淫巧建议在掌握基础之后再深入挖掘。为了帮助大家用尽量短的时间,掌握其最核心的常用功能,我们还是遵循20/80法则:用20%的时间,掌握80%最主要的知识点,为大家献上《Pandas入门教程》嘻嘻, 这个系列的内容主要会包含以下的知识点:
- Series, DataFrame
- 索引、过滤(Indexing, Filtering)
- 排序、更新行列(Sorting, Updating Rows and Columns)
- 合并和分组(Concatenation, Grouping)
- 数据清理(Data Cleaning)
- 数据可视化(Plotting)
如果你未来要经常和数据打交道,Pandas绝对会是你职业道路上必不可少的好伙伴,希望大家能通过接下来的学习快速入门Pandas,加油哦~