如何根据Pandas数据框中的列表重新排序索引行

nev*_*int 51 python pandas

我有一个如下所示的数据框:

company  Amazon  Apple  Yahoo
name
A             0    130      0
C           173      0      0
Z             0      0    150
Run Code Online (Sandbox Code Playgroud)

它是使用以下代码创建的:

import pandas as pd
df = pd.DataFrame({'name' : ['A', 'Z','C'],
                   'company' : ['Apple', 'Yahoo','Amazon'],
                   'height' : [130, 150,173]})

df = df.pivot(index="name", columns="company", values="height").fillna(0)
Run Code Online (Sandbox Code Playgroud)

我想要做的是name根据预定义的列表对行(带索引)进行排序["Z", "C", "A"].结果如下:

company  Amazon  Apple  Yahoo
name
Z             0      0    150
C           173      0      0
A             0    130      0
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Zer*_*ero 71

您可以使用reindexlike 设置预定义订单的索引

In [14]: df.reindex(["Z", "C", "A"])
Out[14]:
company  Amazon  Apple  Yahoo
Z             0      0    150
C           173      0      0
A             0    130      0
Run Code Online (Sandbox Code Playgroud)

但是,如果它是字母顺序,您可以使用 sort_index(ascending=False)

In [12]: df.sort_index(ascending=False)
Out[12]:
company  Amazon  Apple  Yahoo
name
Z             0      0    150
C           173      0      0
A             0    130      0
Run Code Online (Sandbox Code Playgroud)

如下所示,您需要将其分配给某个变量

In [13]: df = df.sort_index(ascending=False)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会修改数组,您必须将其分配给某些内容. (14认同)
  • 另请注意,如果碰巧有多索引,则需要在reindex调用中使用其他参数,例如`df.reindex(axis ='index',level = 0,labels = yourlabels_list)`或者你的标签会需要匹配你的多指数. (5认同)
  • 当我执行此代码时,我的所有值都更改为“nan”。为什么会发生这种情况以及如何预防? (3认同)
  • @ Robvh ,当传递给 df.reindex() 的列表值(示例中```["Z", "C", "A"]```)不是 ```df 的索引时,就会发生这种情况``` 因此它使用不包含数据的新索引创建新行。 (2认同)

小智 12

我们还可以使用loc

lst = ["Z", "C", "A"]
df = df.loc[lst]
Run Code Online (Sandbox Code Playgroud)

输出:

company  Amazon  Apple  Yahoo
name                         
Z             0      0    150
C           173      0      0
A             0    130      0
Run Code Online (Sandbox Code Playgroud)

请注意,如果 中 存在lst不存在的值df.index(例如 if lst=['Z','C','A','D']),则loc抛出 KeyError (而reindex创建一个充满 NaN 的新行'D')。


多重索引

如果df是MultiIndex,如:

           C3
C1 C2        
2  evelen   0
   ten      1
   twelve   2
1  evelen   3
   ten      4
   twelve   5
Run Code Online (Sandbox Code Playgroud)

ten如果您想按,eleven和排序第二级twelve,则使用loc

out = df.loc[:, ['ten','evelen', 'twelve'],:]
Run Code Online (Sandbox Code Playgroud)

输出:

           C3
C1 C2        
2  evelen   0
   ten      1
   twelve   2
1  evelen   3
   ten      4
   twelve   5
Run Code Online (Sandbox Code Playgroud)

对于两个级别:

out = df.loc[[1,2], ['ten','evelen','twelve'], :]
Run Code Online (Sandbox Code Playgroud)

输出:

           C3
C1 C2        
1  ten      4
   evelen   3
   twelve   5
2  ten      1
   evelen   0
   twelve   2
Run Code Online (Sandbox Code Playgroud)