无法播放?请 点击这里 跳转到Youtube
切换视频源:

什么是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入门教程》嘻嘻, 这个系列的内容主要会包含以下的知识点:

  1. Series, DataFrame
  2. 索引、过滤(Indexing, Filtering)
  3. 排序、更新行列(Sorting, Updating Rows and Columns)
  4. 合并和分组(Concatenation, Grouping)
  5. 数据清理(Data Cleaning)
  6. 数据可视化(Plotting)

如果你未来要经常和数据打交道,Pandas绝对会是你职业道路上必不可少的好伙伴,希望大家能通过接下来的学习快速入门Pandas,加油哦~