Pandas实战-DataFrame对象

本文将主要介绍以下内容:

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值