本文将主要介绍以下内容:
1. DataFrame概述
2. Series和DataFrame的相似点
3. DataFrame排序
4. 按DataFrame索引排序
5. 设置新索引
6. 从DataFrame读取列
7. 从DataFrame读取行
8. 重命名列或行
9. 重置索引
DataFrame是Pandas的另外一个主要的数据结构,它是由行和列组成的二维数据结构,因此需要两个参考点来从数据集中提取给定值。
1. DataFrame概述
DataFrame可以描述为网格或数据表,类似于Excel之类的电子表格中的网格或数据表。
1.1 从字典创建DataFrame
和往常一样,让我们从导入pandas开始,还将使用NumPy库生成一些随机数据:
In [1]: import pandas as pd
import numpy as np
在导入第一个数据集之前,让我们练习从一些Python内置对象实例化一个DataFrame。例如字典,其键将用作列名,而相应的值将用作该列的值。
下例使用三个长度相等的列表来存储城市,国家和人口。也可以使用其它可迭代对象(如元组或Series)代替列表。DataFrame类的第一个参数data代表数据源。
In [2]: city_data = {
"City": ["New York City", "Paris", "Barcelona", "Rome"],
"Country": ["United States", "France", "Spain", "Italy"],
"Population": [8600000, 2141000, 5515000, 2873000]
}
cities = pd.DataFrame(city_data)
cities
Out [2]: City Country Population
0 New York City United States 8600000
1 Paris France 2141000
2 Barcelona Spain 5515000
3 Rome Italy 2873000
我们创建了第一个DataFrame,它与Series非常相似。再次提醒,当我们没有为构造函数提供一个明确的索引时,pandas会默认生成一个从0开始的顺序索引。
如果我们想翻转数据,以列标头作为索引标签,我们可以调用transpose方法或其T属性:
In [3]: cities.transpose() # 此行代码和下面代码是一样的
cities.T
Out [3]: 0 1 2 3
City New York City Paris Barcelona Rome
Country United States France Spain Italy
Population 8600000 2141000 5515000 2873000
另外还可以使用一个更方便的from_dict方法,此方法用于把字典转换为DataFrame。其参数orient用于控制索引标签的创建,如果想把字典的键保存为DataFrame的列,可以使用默认值columns;如果想把字典的键保存为行,则使用值index:
In [4]: pd.DataFrame.from_dict(data = city_data, orient = "index")
Out [4]: 0 1 2 3
City New York City Paris Barcelona Rome
Country United States France Spain Italy
Population 8600000 2141000 5515000 2873000
1.2 从NumPy 数组创建DataFrame
DataFrame构造函数还接受NumPy ndarray对象。假设我们要创建一个3x5的DataFrame,其整数在1到100(含)之间,我们可以使用random模块的randint方法:
In [5]: data = np.random.randint(1, 101, [3, 5])
data
Out [5]: array([[25, 22, 80, 43, 42],
[40, 89, 7, 21, 25],
[89, 71, 32, 28, 39]])
接下来,我们将ndarray传到DataFrame构造函数中。与行一样,如果未提供自定义的列标头,Pandas将为每列分配一个数字索引:
In [6]: pd.DataFrame(data = data)
Out [6]: 0 1 2 3 4
0 25 22 80 43 42
1 40 89 7 21 25
2 89 71 32 28 39
我们可以使用可迭代序列,例如列表,元组或ndarray,以用作行标签。请注意,可迭代项的长度必须等于数据集中的行数。这是一个3x5的表格,因此我们必须为索引提供3个标签。
In [7]: index = ["Morning", "Afternoon", "Evening"]
temperatures = pd.DataFrame(data = data, index = index)
temperatures
Out [7]: 0 1 2 3 4
Morning 25 22 80 43 42
Afternoon 40 89 7 21 25
Evening 89 71 32 28 39
columns参数允许我们设置DataFrame的列名(也称为垂直标签)。因为我们总共有5列,所以我们的可迭代项的长度必须为5。下例通过将标头存储在元组中来设置列名:
In [8]: index = ["Morning", "Afternoon", "Evening"]
columns = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
temperatures = pd.DataFrame(data = data,
index = index,
columns = columns)
temperatures
Out [8]: Monday Tuesday Wednesday Thursday Friday
Morning 25 22 80 43 42
Afternoon 40 89 7 21 25
Evening 89 71 32 28 39
行索引和列索引都允许包含重复值:
In [9]: index = ["Morning", "Afternoon", " Morning"]
columns = ("Monday", "Tuesday", "Wednesday", "Tuesday", "Friday")
temperatures = pd.DataFrame(data = data,
index = index,
columns = columns)
temperatures
Out [9]: Monday Tuesday Wednesday Tuesday Friday
Morning 25 22 80 43 42
Afternoon 40 89 7 21 25
Morning 89 71 32 28 39
2. Series和DataFrame的相似点
在之前介绍的许多Series属性和方法在DataFrame上也适用。
2.1 导入CSV数据集
nba.csv文件是2019-2020 NBA运动员的数据集,包括每个球员的姓名,球队,位置,生日和工资:
In [10]: pd.read_csv("nba.csv")
Out [10]: Name Team Position Birthday Salary
0 Shake Milton Philadelphia 76ers SG 9/26/96 1445697
1 Christian Wood Detroit Pistons PF 9/27/95 1645357
2 PJ Washington Charlotte Hornets PF 8/23/98 3831840
3 Derrick Rose Detroit Pistons PG 10/4/88 7317074
4 Marial Shayok Philadelphia 76ers G 7/26/95 79568
… … … … … …
445 Austin Rivers Houston Rockets PG 8/1/92 2174310
446 Harry Giles Sacramento Kings PF 4/22/98 2578800
447 Robin Lopez Milwaukee Bucks C 4/1/88 4767000
448 Collin Sexton Cleveland Cavaliers PG 1/4/99 4764960
449 Ricky Rubio Phoenix Suns PG 10/21/90 16200000
450 rows x 5 columns
注意,Birthday列中的值默认是作为字符串而不是datetime对象导入,之前介绍过可以使用parse_dates参数将值强制转换为datetime,一致以YYYY-MM-DD格式显示:
In [11]: pd.read_csv("nba.csv", parse_dates = ["Birthday"])
Out [11]: Name Team Position Birthday Salary
0 Shake Milton Philadelphia 76ers SG 1996-09-26 1445697
1 Christian Wood Detroit Pistons PF 1995-09-27 1645357
2 PJ Washington Charlotte Hornets PF 1998-08-23 3831840
3 Derrick Rose Detroit Pistons PG 1988-10-04 7317074
4 Marial Shayok Philadelphia 76ers G 1995-07-26 79568
… … … … … …
445 Austin Rivers Houston Rockets PG 1992-08-01 2174310
446 Harry Giles Sacramento Kings PF 1998-04-22 2578800
447 Robin Lopez Milwaukee Bucks C 1988-04-01 4767000
448 Collin Sexton Cleveland Cavaliers PG 1999-01-04 4764960
449 Ricky Rubio Phoenix Suns PG 1990-10-21 16200000
450 rows x 5 columns
现在我们可以把DataFrame分配给一个变量nba:
In [12]: nba = pd.read_csv("nba.csv", parse_dates = ["Birthday"])
2.2 共享和专用属性
Series的值必须是单一同质的数据类型,而DataFrame的列可以保存异构的数据。让我们使用dtypes属性查看各自的数据类型,它返回的是一个Series对象:
In [13]: nba.dtypes
Out [13]: Name object