Pandas教程【国宝级教程,一万八千字总结】(下)

简介: 本文长度多达一万八千多字,概念性的问题占了两千六百字,阅读完成+代码实验完成所需时间绝对不下两个小时,所以无论如何我也要请大家耐着性子读完这一万八千字。

列索引实现分层

我们知道,列索引存在于 DataFrame 结构中,下面创建一个 DataFrame 来演示列索引如何实现分层。

import numpy as np  
info = pd.DataFrame(np.arange(12).reshape(4, 3), 
index = [['a', 'a', 'b', 'b'], ['one', 'two', 'three', 'four']],  
columns = [['num1', 'num2', 'num3'], ['x', 'y', 'x']] )  
print(info)

输出结果:

num1 num2 num3

x y x

a one 0 1 2

two 3 4 5

b three 6 7 8

four 9 10 11

查看所有列索引:

info.columns

输出结果:

MultiIndex([(‘num1’, ‘x’),

(‘num2’, ‘y’),

(‘num3’, ‘x’)],)

交换层和层排序

  1. 交换层

通过 swaplevel() 方法轻松地实现索引层交换,示例如下:

import pandas as pd
frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
                  index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
                  columns=[['Ohio', 'Ohio', 'Colorado'],
                           ['Green', 'Red', 'Green']])
#设置index的levels名称                         
frame.index.names = ['key1', 'key2']
#设置columns的levels名称
frame.columns.names = ['state','color']
#交换key1层与key层
frame.swaplevel('key1','key2')

输出结果:

state Ohio Colorado

color Green Red Green

key2 key1

1 a 0 1 2

2 a 3 4 5

1 b 6 7 8

2 b 9 10 11

  1. 层排序

通过 sort_index() 的level参数实现对层的排序。下面示例,按“key1”的字母顺序重新排序。

import pandas as pd
frame = pd.DataFrame(np.arange(12).reshape((4, 3)),
                  index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
                  columns=[['Ohio', 'Ohio', 'Colorado'],
                           ['Green', 'Red', 'Green']])
#设置index的levels的名称,key1 与 key2分别对应不同的层                         
frame.index.names = ['key1', 'key2']
#设置columns的levels的名称
frame.columns.names = ['state','color']
print(frame.sort_index(level='key1'))

输出结果:

state Ohio Colorado

color Green Red Green

key1 key2

a 1 0 1 2

2 3 4 5

b 1 6 7 8

2 9 10 11

Pandas执行SQL操作

我们知道,使用 SQL 语句能够完成对 table 的增删改查操作,Pandas 同样也可以实现 SQL 语句的基本功能。本节主要讲解 Pandas 如何执行 SQL 操作。

首先加载一个某连锁咖啡厅地址分布的数据集,通过该数据集对本节内容进行讲解。

import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
coffee_df.head()

输出结果如下:

address category id tel

0 北京市东城区南竹竿胡同2号1幢2层30212号银河SOHOC座 娱乐休闲:咖啡厅 1874263549184796345 010-85179080

1 北京市东城区东直门内大街277-31号档口 娱乐休闲:咖啡厅 1461638360847848424 400-669-2002

2 北京市东城区王府井东街8号澳门中心L117商场102室 娱乐休闲:咖啡厅 1308505235389562852 400-010-0100

3 北京市东城区前门大街108号底商 娱乐休闲:咖啡厅 15442844740539053384

4 北京市东城区和平里西街51号雍和宫壹中心A座负一层 娱乐休闲:咖啡厅 2357391864111641256 4000100100

SELECT

在 SQL 中,SELECT 查询语句使用,把要查询的每个字段分开,当然您也可以使用*来选择所有的字段。如下所示:

SELECT address, category, id, tel FROM tips LIMIT 5;

对于 Pandas 而言,要完成 SELECT 查询,需要把数据集每一列(columns)的名称传递给 DataFrame 对象。如下所示:

coffee_df[['address','category','id','tel']].head()

下面代码是 Pandas 执行 SELECT 查询的完整程序:

import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
#只查看尾3行
coffee_df[['address', 'category', 'id', 'tel']].tail(3)

输出结果如下:

address category id tel

28912 新疆维吾尔自治区北屯市芳园路69-2-12 娱乐休闲:咖啡厅 7443833746160692626

28913 新疆维吾尔自治区北屯市北屯购物公园7-1-7 娱乐休闲:咖啡厅 15288143245642241877

28914 新疆维吾尔自治区可克达拉市人民西路与育才路交叉口西北50米 娱乐休闲:咖啡厅 17884214706482955

假如您传入的是一个空列表, 那最终结果将输出所有的行索引标签。

WHERE

SQL 中的条件查询是通过 WHERE 子句完成的。格式如下所示:

SELECT * FROM coffee_df WHERE tel = '010-85179080';

然而 DataFrame 可以通过多种方式实现条件筛选,最直观的方法是通过布尔索引:

coffee_df[coffee_df['id'] == '1461638360847848424']

完整程序如下:

import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
coffee_df[coffee_df['tel'] == '400-010-0100'].head(5)

输出结果如下:

address category id tel

2 北京市东城区王府井东街8号澳门中心L117商场102室 娱乐休闲:咖啡厅 1308505235389562852 400-010-0100

5 北京市东城区崇文门外大街3号崇文新世界百货一期南门一层 娱乐休闲:咖啡厅 3294587167648650139 400-010-0100

6 北京市东城区东四北大街265号文化金融大厦1层大堂 娱乐休闲:咖啡厅 3046481700882245722 400-010-0100

7 北京市东城区珠市口东大街2号丰泰中心1层 娱乐休闲:咖啡厅 3218554253235914037 400-010-0100

9 北京市东城区怡生健身居然大厦店休闲区 娱乐休闲:咖啡厅 3141197020974020427 400-010-0100

上面的语句通过布尔运算将 True 或 False 对象传递给 DataFrame 对象,然后返回所有为 True 的行。

GroupBy

在 SQL 语句中,通过 GroupBy 操作可以获取 table 中一组记录的计数。示例如下:

SELECT id, count(*) FROM tips GROUP BY id;

而 Pandas 可通过以下代码实现:

coffe_df.groupby('id').size()

完整的程序如下所示:

import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
print(coffee_df.groupby('id').size())

输出结果:

id

938817537566269 1

1343221331916894 1

2068013370184103 1

2147497429057385 1

4021181356852391 1

18443951046631684378 1

18444337559943971606 1

18444494959108924300 1

18445005868173060838 1

18446259420330511125 1

Length: 23240, dtype: int64

LIMIT

在 SQL 中,LIMIT 语句主要起到限制作用,比如查询前 n 行记录:

SELECT * FROM coffee_df LIMIT n;

而在 Pandas 中,您可以通过 head() 来实现(默认前 5 行),示例如下:

import pandas as pd
url = 'C:/Users/Administrator/Desktop/coffee/kafei.xlsx'
coffee_df=pd.read_excel(url)
coffee_df[['address',  'tel']].head(3)

输出结果:

address tel

0 北京市东城区南竹竿胡同2号1幢2层30212号银河SOHOC座 010-85179080

1 北京市东城区东直门内大街277-31号档口 400-669-2002

2 北京市东城区王府井东街8号澳门中心L117商场102室 400-010-0100

Pandas和NumPy的比较

我们知道 Pandas 是在 NumPy 的基础构建而来,因此,熟悉 NumPy 可以更加有效的帮助我们使用 Pandas。

创建数组

数组的主要作用是在一个变量中存储多个值。NumPy 可以轻松地处理多维数组,示例如下:

import numpy as np
arr = np.array([2, 4, 6, 8, 10, 12])
print(type(arr))
print ("打印新建数组: ",end="")
#使用for循环读取数据 
for l in range (0,5): 
    print (arr[l], end=" ")

输出结果:

<class ‘numpy.ndarray’>

打印新建数组: 2 4 6 8 10

虽然 Python 本身没有数组这个说法,不过 Python 提供一个 array 模块,用于创建数字、字符类型的数组,它能够容纳字符型、整型、浮点型等基本类型。示例如下:

import array
#注意此处的 'l' 表示有符号int类型 
arr = array.array('l', [2, 4, 6, 8, 10, 12])
print(type(arr))
print ("新建数组: ",end="") 
for i in range (0,5): 
    print (arr[i], end=" ") 

输出结果:

<class ‘array.array’>

新建数组: 2 4 6 8 10

布尔索引

布尔索引是 NumPy 的重要特性之一,通常与 Pandas 一起使用。它的主要作用是过滤 DataFrame 中的数据,比如布尔值的掩码操作。

下面示例展示了如何使用布尔索引访问 DataFrame 中的数据。

首先创建一组包含布尔索引的数据,如下所示:

import pandas as pd 
dict = {'name':["Smith", "William", "Phill", "Parker"],  
        'age': ["28", "39", "34", "36"]}  
info = pd.DataFrame(dict, index = [True, True, False, True])  
print(info)

输出结果:

name age

True Smith 28

True William 39

False Phill 34

True Parker 36

然后使用.loc访问索引为 True 的数据。示例如下:

import pandas as pd   
dict = {'name':["Smith", "William", "Phill", "Parker"],  
        'age': ["28", "39", "34", "36"]}  
info = pd.DataFrame(dict, index = [True, True, False, True])
#返回所有为 True的数据     
print(info.loc[True]) 

输出结果:

name age

True Smith 28

True William 39

True Parker 36

重塑数组形状

在不改变数组数据的情况下,对数组进行变形操作,即改变数组的维度,比如 23(两行三列)的二维数组变维 32(三行两列)的二维数组。变形操作可以通过 reshape() 函数实现。

示例如下:

import numpy as np 
arr = np.arange(16) 
print("原数组: \n", arr) 
arr = np.arange(16).reshape(2, 8) 
print("\n变形后数组:\n", arr) 
arr = np.arange(16).reshape(8 ,2) 
print("\n变形后数组:\n", arr)

输出结果:

原数组:

[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]

变形后数组:

[[ 0 1 2 3 4 5 6 7]

[ 8 9 10 11 12 13 14 15]]

变形后数组:

[[ 0 1]

[ 2 3]

[ 4 5]

[ 6 7]

[ 8 9]

[10 11]

[12 13]

[14 15]]

Pdans与NumPy区别

Pandas 和 NumPy 被认为是科学计算与机器学习中必不可少的库,因为它们具有直观的语法和高性能的矩阵计算能力。下面对 Pandas 与 NumPy 进行简单的总结,如下表所示:

image.png

转换ndarray数组

在某些情况下,需要执行一些 NumPy 数值计算的高级函数,这个时候您可以使用 to_numpy() 函数,将 DataFrame 对象转换为 NumPy ndarray 数组,并将其返回。函数的语法格式如下:

DataFrame.to_numpy(dtype=None, copy=False)   

参数说明如下:

dtype:可选参数,表示数据类型;

copy:布尔值参数,默认值为 Fales,表示返回值不是其他数组的视图。

下面使用示例,了解该函数的使用方法。

示例 1
info = pd.DataFrame({"P": [2, 3], "Q": [4.0, 5.8]})
#给info添加R列 
info['R'] = pd.date_range('2020-12-23', periods=2)
print(info)
#将其转化为numpy数组 
n=info.to_numpy()
print(n)
print(type(n))

输出结果:

[[2 4.0 Timestamp(‘2020-12-23 00:00:00’)]

[3 5.8 Timestamp(‘2020-12-24 00:00:00’)]]

可以通过 type 查看其类型,输出如下:

numpy.ndarray
示例2:
import pandas as pd 
#创建DataFrame对象
info = pd.DataFrame([[17, 62, 35],[25, 36, 54],[42, 20, 15],[48, 62, 76]], 
columns=['x', 'y', 'z']) 
print('DataFrame\n----------\n', info) 
#转换DataFrame为数组array
arr = info.to_numpy() 
print('\nNumpy Array\n----------\n', arr) 

输出结果:

DataFrame

x y z

0 17 62 35

1 25 36 54

2 42 20 15

3 48 62 76

Numpy Array

[[17 62 35]

[25 36 54]

[42 20 15]

[48 62 76]]

相关文章
|
7天前
|
索引 Python
Pandas 2.2 中文官方教程和指南(一)(4)
Pandas 2.2 中文官方教程和指南(一)
11 0
|
7天前
|
存储 SQL JSON
Pandas 2.2 中文官方教程和指南(一)(3)
Pandas 2.2 中文官方教程和指南(一)
15 0
|
7天前
|
XML 关系型数据库 PostgreSQL
Pandas 2.2 中文官方教程和指南(一)(2)
Pandas 2.2 中文官方教程和指南(一)
11 0
|
7天前
|
XML 关系型数据库 MySQL
Pandas 2.2 中文官方教程和指南(一)(1)
Pandas 2.2 中文官方教程和指南(一)
8 0
|
7天前
|
C++ 索引 Python
Pandas 2.2 中文官方教程和指南(五)(4)
Pandas 2.2 中文官方教程和指南(五)
11 0
|
7天前
|
索引 Python
Pandas 2.2 中文官方教程和指南(五)(3)
Pandas 2.2 中文官方教程和指南(五)
10 0
|
7天前
|
SQL API 数据格式
Pandas 2.2 中文官方教程和指南(五)(2)
Pandas 2.2 中文官方教程和指南(五)
11 0
|
7天前
|
SQL API 数据格式
Pandas 2.2 中文官方教程和指南(五)(1)
Pandas 2.2 中文官方教程和指南(五)
18 0
|
7天前
|
索引 Python
Pandas 2.2 中文官方教程和指南(四)(4)
Pandas 2.2 中文官方教程和指南(四)
10 0
|
7天前
|
存储 SQL 索引
Pandas 2.2 中文官方教程和指南(十一·二)(4)
Pandas 2.2 中文官方教程和指南(十一·二)
12 1