【问题标题】:How to order the values a pandas data frame based on the predefined array containing the desired order?如何根据包含所需顺序的预定义数组对熊猫数据框的值进行排序?
【发布时间】:2020-03-09 00:47:46
【问题描述】:
df = pd.DataFrame({'id': [1, 2, 3, 4, 5],
 'p1': [0, 0, 1, 1, 2],
 'p2': [9, 2, 3, 5, 3],
 'p3': [1, 3, 10, 3, 7],
 'p4': [4, 4, 7, 1, 10]})

df = df.set_index('id')
df

    p1  p2  p3  p4
id                
1    0   9   1   4

2    0   2   3   4

3    1   3  10   7

4    1   5   3   1

5    2   3   7  10

现在假设我有一个数据框,其中包含 df 数据框的每个元素所需的逐行位置。例如,说,

 order=np.argsort(-df.values,axis=1)

order
array([[1, 3, 2, 0],  
       [3, 2, 1, 0],  
       [2, 3, 1, 0],  
       [1, 2, 0, 3],  
       [3, 2, 1, 0]], dtype=int64)

如何根据 order 数组的元素对 df 数据框元素进行排序?

想要的结果是

    p1  p2  p3  p4
id                
1    9   4   1   0
2    4   3   2   0
3   10   7   3   1
4    5   3   1   1
5   10   7   3   2

【问题讨论】:

  • 你介意发布你的预期输出吗?
  • 我已经添加了所需的输出。谢谢。
  • 我想要一种适用于任意顺序数组的方法。

标签: python pandas


【解决方案1】:

您可以使用numpy.take_along_axis 提供的“花式”索引来创建数据数组,然后重新创建整个 DataFrame。

pd.DataFrame(np.take_along_axis(df.to_numpy(), order, axis=1),
             index=df.index,
             columns=df.columns)

    p1  p2  p3  p4
id                
1    9   4   1   0
2    4   3   2   0
3   10   7   3   1
4    5   3   1   1
5   10   7   3   2

【讨论】:

    【解决方案2】:

    创建一个像这里显示的映射器,然后你可以这样做:

    mapper={0:'p1',1:'p2',2:'p3',3:'p4'}
    df_copy=df.copy()
    for index, row in df.iterrows():
        i=0
        for name, values in row.iteritems():
    
            df[name][index]=df_copy[mapper[order[index-1][i]]][index]
            i=i+1
    

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2022-07-19
      • 2013-12-15
      • 2015-11-06
      • 2023-01-10
      相关资源
      最近更新 更多