首页 > 解决方案 > 使用列表列对 Pandas DataFrame 进行排序

问题描述

我有一个从这样的数据透视表创建的数据框:

我的钥匙 价值观1 价值观2 价值观3
1 [1,2,0] [2,3,5] [2,3,4]
3 [2,1] [3,1] [2,1]

我想按 values1 升序对数据框中的列表进行排序,并将该排序反映在 values2 和 values3 的排序中,如下所示:

我的钥匙 价值观1 价值观2 价值观3
1 [0,1,2] [5,2,3] [4,2,3]
3 [1,2] [1,3] [1,2]

现在,我在创建数据透视表之前对数组的输入值进行了排序,这似乎可行,但我认为在创建数据透视表后可能会有一种方法来对数据进行排序。

标签: pandaslistsortingpivot

解决方案


您可以同时将所有列df.apply(pd.Series.explode)分解为更长的数据框以准备排序。然后,.groupby回到一个列表,现在按所需的顺序:

import pandas as pd
df = pd.DataFrame({'mykey' : [1, 3],
'values1' : [[1,2,0], [2,1]],
'values2' : [[2,3,5], [3,1]],
'values3' : [[2,3,4], [2,1]]})
df = (df.apply(pd.Series.explode)
      .reset_index()
      .sort_values(['mykey', 'values1'])
      .drop('index', axis=1)
      .groupby('mykey') # Passing 'sort=False' could have a minor performance boost even though already sorted.
      .agg(list)
      .reset_index())
df
Out[1]: 
   mykey    values1    values2    values3
0      1  [0, 1, 2]  [5, 2, 3]  [4, 2, 3]
1      3     [1, 2]     [1, 3]     [1, 2]

推荐阅读