学习Python中的Pandas数据框架索引

137 阅读11分钟

Pandas数据框架是Python中用于数据分析和机器学习任务的最常用的数据结构之一。在这篇文章中,我们将讨论如何创建和删除pandas数据框架的索引。我们还将讨论pandas数据框架中的多级索引,以及我们如何使用数据框架索引访问数据框架中的元素。

什么是Pandas Dataframe索引?

就像数据框架有列名一样,你可以把索引看作是一个行标签。当我们创建一个数据框架时,数据框架的行会被分配索引,从0开始直到行数减去1,如下图所示。

import pandas as pd
list1=[1,2,3]
list2=[3,55,34]
list3=[12,32,45]
myList=[list1,list2,list3]
myDf=pd.DataFrame(myList,columns=["A", "B", "C"])
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
    A   B   C
0   1   2   3
1   3  55  34
2  12  32  45
The index is:
[0, 1, 2]

在创建Pandas数据框架的同时创建一个索引

你也可以在创建数据框架时创建自定义索引。为此,你可以使用DataFrame() 函数的参数indexindex 参数接收一个值的列表,并将这些值分配为数据框架中的行的索引。你可以在下面的例子中观察到这一点。

import pandas as pd
list1=[1,2,3]
list2=[3,55,34]
list3=[12,32,45]
myList=[list1,list2,list3]
myDf=pd.DataFrame(myList,columns=["A", "B", "C"],index=[101,102,103])
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
      A   B   C
101   1   2   3
102   3  55  34
103  12  32  45
The index is:
[101, 102, 103]

在上面的例子中,我们已经使用列表[101, 102, 103]DataFrame() 函数的参数index 创建了数据框架的索引。

在这里,你需要确保传递给index 参数的列表中的元素数应该等于数据框架中的行数。否则,程序将遇到ValueError异常,如下所示。

import pandas as pd
list1=[1,2,3]
list2=[3,55,34]
list3=[12,32,45]
myList=[list1,list2,list3]
myDf=pd.DataFrame(myList,columns=["A", "B", "C"],index=[101,102,103,104])
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

ValueError: Length of values (3) does not match length of index (4)

在上面的例子中,你可以观察到,我们在传递给index参数的列表中传递了4个元素。然而,数据框架只有三行。因此,程序遇到了Python ValueError异常。

在加载CSV文件时创建数据框架索引

如果你正在创建一个csv文件的数据框架,并且你想把csv文件的某一列作为数据框架的索引,你可以在read_csv() 函数中使用index_col 参数。

index_col 参数将列的名称作为其输入参数。在执行read_csv() 函数后,指定的列被分配为数据框架的索引。你可以在下面的例子中观察到这一点。

myDf=pd.read_csv("samplefile.csv",index_col="Class")
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
       Roll      Name
Class                
1        11    Aditya
1        12     Chris
1        13       Sam
2         1      Joel
2        22       Tom
2        44  Samantha
3        33      Tina
3        34       Amy
The index is:
[1, 1, 1, 2, 2, 2, 3, 3]

你也可以把列名在列列表中的位置而不是它的名字作为输入参数传给index_col 。例如,如果你想把pandas数据框架的第一列作为它的索引,你可以在DataFrame() 函数中给index_col 参数传递0,如下图所示。

myDf=pd.read_csv("samplefile.csv",index_col=0)
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
       Roll      Name
Class                
1        11    Aditya
1        12     Chris
1        13       Sam
2         1      Joel
2        22       Tom
2        44  Samantha
3        33      Tina
3        34       Amy
The index is:
[1, 1, 1, 2, 2, 2, 3, 3]

这里,Class 列是csv文件中的第一列。因此,它被转换为数据框架的索引。

index_col 参数也接受多个值作为其输入。我们已经在数据框架的多级索引一节中讨论过这个问题。

在创建潘达斯数据框架后创建索引

当一个数据框架被创建时,数据框架的行被分配了索引,从0开始直到行数减去1。然而,我们可以使用索引属性为数据框架创建一个自定义索引。

为了在pandas数据框架中创建一个自定义索引,我们将为数据框架的索引属性分配一个索引标签列表。在执行赋值语句后,为数据框架创建一个新的索引,如下所示。

myDf=pd.read_csv("samplefile.csv")
print("The dataframe is:")
myDf.index=[101,102,103,104,105,106,107,108]
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
     Class  Roll      Name
101      1    11    Aditya
102      1    12     Chris
103      1    13       Sam
104      2     1      Joel
105      2    22       Tom
106      2    44  Samantha
107      3    33      Tina
108      3    34       Amy
The index is:
[101, 102, 103, 104, 105, 106, 107, 108]

在这里,你可以看到我们已经为数据框架的索引属性分配了一个包含从101到108的数字的列表。因此,列表中的元素被转换为数据框架中的行的索引。

记住,列表中索引标签的总数应该等于数据框架中的行数。否则,程序将遇到ValueError异常。

将数据框架的列转换成索引

我们也可以使用一个列作为数据框架的索引。为此,我们可以使用set_index() 方法。set_index() 方法,当在一个数据框架上调用时,将列名作为其输入参数。执行后,它返回一个新的数据框架,并将指定的列作为其索引,如下例所示。

myDf=pd.read_csv("samplefile.csv")
print("The dataframe is:")
myDf=myDf.set_index("Class")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
       Roll      Name
Class                
1        11    Aditya
1        12     Chris
1        13       Sam
2         1      Joel
2        22       Tom
2        44  Samantha
3        33      Tina
3        34       Amy
The index is:
[1, 1, 1, 2, 2, 2, 3, 3]

在上面的例子中,我们使用set_index() 方法从数据框架的一个现有列中创建索引,而不是一个新的序列。

改变潘达斯数据框架的索引

你可以使用set_index() 方法来改变一个数据框架的索引列。为此,你只需要将新的索引列的列名作为输入传给set_index() 方法,如下所示。

myDf=pd.read_csv("samplefile.csv")
print("The dataframe is:")
myDf=myDf.set_index("Class")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)
print("The modified dataframe is:")
newDf=myDf.set_index("Roll")
print(newDf)
print("The index is:")
index=list(newDf.index)
print(index)

输出。

The dataframe is:
       Roll      Name
Class                
1        11    Aditya
1        12     Chris
1        13       Sam
2         1      Joel
2        22       Tom
2        44  Samantha
3        33      Tina
3        34       Amy
The index is:
[1, 1, 1, 2, 2, 2, 3, 3]
The modified dataframe is:
          Name
Roll          
11      Aditya
12       Chris
13         Sam
1         Joel
22         Tom
44    Samantha
33        Tina
34         Amy
The index is:
[11, 12, 13, 1, 22, 44, 33, 34]

如果你想指定一个序列作为数据框架的新索引,你可以将该序列分配给pandas数据框架的索引属性,如下图所示。

myDf=pd.read_csv("samplefile.csv")
print("The dataframe is:")
myDf=myDf.set_index("Class")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)
print("The modified dataframe is:")
myDf.index=[101, 102, 103, 104, 105, 106, 107, 108]
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
       Roll      Name
Class                
1        11    Aditya
1        12     Chris
1        13       Sam
2         1      Joel
2        22       Tom
2        44  Samantha
3        33      Tina
3        34       Amy
The index is:
[1, 1, 1, 2, 2, 2, 3, 3]
The modified dataframe is:
     Roll      Name
101    11    Aditya
102    12     Chris
103    13       Sam
104     1      Joel
105    22       Tom
106    44  Samantha
107    33      Tina
108    34       Amy
The index is:
[101, 102, 103, 104, 105, 106, 107, 108]

当我们改变一个数据框架的索引列时,现有的索引列会从数据框架中删除。因此,在改变索引列之前,你应该先将索引列存储到数据框架的一个新列中。否则,你会从数据框架中丢失存储在索引列中的数据。

myDf=pd.read_csv("samplefile.csv")
print("The dataframe is:")
myDf=myDf.set_index("Class")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)
print("The modified dataframe is:")
myDf["Class"]=myDf.index
myDf.index=[101, 102, 103, 104, 105, 106, 107, 108]
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
       Roll      Name
Class                
1        11    Aditya
1        12     Chris
1        13       Sam
2         1      Joel
2        22       Tom
2        44  Samantha
3        33      Tina
3        34       Amy
The index is:
[1, 1, 1, 2, 2, 2, 3, 3]
The modified dataframe is:
     Roll      Name  Class
101    11    Aditya      1
102    12     Chris      1
103    13       Sam      1
104     1      Joel      2
105    22       Tom      2
106    44  Samantha      2
107    33      Tina      3
108    34       Amy      3
The index is:
[101, 102, 103, 104, 105, 106, 107, 108]

在这里,你可以观察到在改变数据框架的索引之前,我们首先将索引存储到Class 列。在之前的例子中,我们没有这样做。由于这个原因,Class 列中的数据被丢失了。

在Pandas数据框架中创建多级索引

你也可以在一个数据框架中创建一个多级索引。多级索引可以帮助你访问分层的数据,比如具有不同抽象层次的人口普查数据。我们可以在创建数据框架的同时,以及在创建数据框架之后创建多级索引。这一点将讨论如下。

在创建数据框架时创建多级索引

要使用数据框架的不同列创建多级索引,你可以使用read_csv() 函数中的index_col 参数。index_col 参数需要一个必须作为索引使用的列的列表。给予index_col 参数的列表中的列名从左到右的顺序是从索引的最高级别到最低级别。执行read_csv() 函数后,你将得到一个具有多级索引的数据框架,如下例所示。

myDf=pd.read_csv("samplefile.csv",index_col=["Class","Roll"])
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
                Name
Class Roll          
1     11      Aditya
      12       Chris
      13         Sam
2     1         Joel
      22         Tom
      44    Samantha
3     33        Tina
      34         Amy
The index is:
[(1, 11), (1, 12), (1, 13), (2, 1), (2, 22), (2, 44), (3, 33), (3, 34)]

在上面的例子中,Class 列包含第一级索引,Roll 列包含第二级索引。要从数据框架中访问元素,你需要知道任何行的两级索引。

你也可以不使用列名,而是将列名在列列表中的位置而不是它的名字作为输入参数传给index_col 。例如,你可以指定数据框架的第一和第三列作为其索引,如下所示。

myDf=pd.read_csv("samplefile.csv",index_col=[0,1])
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
                Name
Class Roll          
1     11      Aditya
      12       Chris
      13         Sam
2     1         Joel
      22         Tom
      44    Samantha
3     33        Tina
      34         Amy
The index is:
[(1, 11), (1, 12), (1, 13), (2, 1), (2, 22), (2, 44), (3, 33), (3, 34)]

在创建数据框架后创建一个多级索引

你也可以在使用set_index() 方法创建数据框架之后创建一个多级索引。为此,你只需要向set_index() 方法传递一个列名的列表。同样,在index_col 参数的列表中,列名的顺序从左到右是从最高级别到最低级别的索引,如下所示。

myDf=pd.read_csv("samplefile.csv")
print("The dataframe is:")
myDf=myDf.set_index(["Class","Roll"])
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
                Name
Class Roll          
1     11      Aditya
      12       Chris
      13         Sam
2     1         Joel
      22         Tom
      44    Samantha
3     33        Tina
      34         Amy
The index is:
[(1, 11), (1, 12), (1, 13), (2, 1), (2, 22), (2, 44), (3, 33), (3, 34)]

你需要记住,set_index() 方法会删除现有的索引列。如果你想保存存储在索引列中的数据,你应该在创建新的索引之前将数据复制到另一列中。

从Pandas数据框架中删除索引

要从pandas数据框架中删除索引,你可以使用reset_index() 方法。reset_index() 方法,当在一个数据框架上调用时,会返回一个没有任何索引列的新数据框架。如果现有的索引是一个特定的列,那么该列又会被转换为一个普通的列,如下图所示。

myDf=pd.read_csv("samplefile.csv",index_col=[0,1])
print("The dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)
myDf=myDf.reset_index()
print("The modified dataframe is:")
print(myDf)
print("The index is:")
index=list(myDf.index)
print(index)

输出。

The dataframe is:
                Name
Class Roll          
1     11      Aditya
      12       Chris
      13         Sam
2     1         Joel
      22         Tom
      44    Samantha
3     33        Tina
      34         Amy
The index is:
[(1, 11), (1, 12), (1, 13), (2, 1), (2, 22), (2, 44), (3, 33), (3, 34)]
The modified dataframe is:
   Class  Roll      Name
0      1    11    Aditya
1      1    12     Chris
2      1    13       Sam
3      2     1      Joel
4      2    22       Tom
5      2    44  Samantha
6      3    33      Tina
7      3    34       Amy
The index is:
[0, 1, 2, 3, 4, 5, 6, 7]

结论

在这篇文章中,我们已经讨论了如何创建pandas数据框架索引。此外,我们还创建了多级索引,并学习了如何从pandas数据框架中删除索引。