【问题标题】:Sort Pandas DataFrame with list column使用列表列对 Pandas DataFrame 进行排序
【发布时间】:2021-04-20 23:31:41
【问题描述】:

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

mykey values1 values2 values3
1 [1,2,0] [2,3,5] [2,3,4]
3 [2,1] [3,1] [2,1]

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

mykey values1 values2 values3
1 [0,1,2] [5,2,3] [4,2,3]
3 [1,2] [1,3] [1,2]

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

【问题讨论】:

  • 这很棘手。您可以使用numpy.argsort() 获取对values1 进行排序的索引,然后将这些索引应用于values2 和values3。
  • 排序的逻辑是什么?似乎每个单元格的逻辑顺序相反?
  • 对不起,我不清楚。我编辑了上面的 OP。我想按 values1 升序排序。
  • 值 2 和 3 怎么样?目前尚不清楚这些是如何分类的。编辑:我想现在我明白了。你是根据 values1 按每个项目的 INDEX/position 排序的。
  • 我希望使用 values1 中的排序索引对它们进行相同的排序。我希望这是有道理的

标签: pandas list sorting pivot


【解决方案1】:

您可以使用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]

【讨论】:

  • 所以,我不只是想颠倒列表的顺序,而是更新了上面的 OP。但是谢谢你发布这个!
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2021-07-24
  • 2018-04-11
相关资源
最近更新 更多