如何通过一个列表中的值对数据框进行排序

3

我有一个数字列表:

[18, 22, 20]

还有一个数据框:

Id                       | node_id
UC5E9-r42JlymhLPnDv2wHuA | 20
UCFqcNI0NaAA21NS9W3ExCRg | 18
UCrb6U1FuOP5EZ7n7LfOJMMQ | 22
  • 列表数字映射到节点 ID 数字。节点 ID 数字的顺序很重要,必须按照列表数字的顺序排列。
  • 因此,数据框的顺序错误。
  • 我需要按照列表值对数据框进行排序。
  • 最终结果应该是:
Id                       | node_id
UCFqcNI0NaAA21NS9W3ExCRg | 18    
UCrb6U1FuOP5EZ7n7LfOJMMQ | 22
UC5E9-r42JlymhLPnDv2wHuA | 20

我该怎么做这件事?

也许这里已经有答案了? https://dev59.com/PGw15IYBdhLWcg3wbbNx - Dylan
不适用于数据框。 - Vega
2个回答

5

使用排序后的Categorical,这样你就可以使用DataFrame.sort_values

L = [18, 22, 20]
df['node_id'] = pd.Categorical(df['node_id'], ordered=True, categories=L)
df = df.sort_values('node_id')
print (df)
                         Id node_id
1  UCFqcNI0NaAA21NS9W3ExCRg      18
2  UCrb6U1FuOP5EZ7n7LfOJMMQ      22
0  UC5E9-r42JlymhLPnDv2wHuA      20

如果想要避免Categorical列:

df = df.iloc[df['node_id'].map({v: k for k, v in enumerate(L)}).argsort()]

谢谢,与YOBEN_S的一行代码有什么区别吗? - Vega
@Vega - 另一个解决方案是错误的。因为缺少了 ordered=True - jezrael

1
我会做。
l=[18, 22, 20]
df=df.iloc[pd.Categorical(df.node_id, l).argsort()]
Out[79]: 
                         Id  node_id
1  UCFqcNI0NaAA21NS9W3ExCRg       18
2  UCrb6U1FuOP5EZ7n7LfOJMMQ       22
0  UC5E9-r42JlymhLPnDv2wHuA       20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接