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

   A  B  C  D
0  7  2  5  2
1  3  3  1  1
2  0  2  6  1
3  3  6  2  9

可以有100列,在上面的示例中,我仅显示了4。

我想为每行及其值提取top-k列。

我可以使用以下方法获取前k个列:
pd.DataFrame({n: df.T[column].nlargest(k).index.tolist() for n, column in enumerate(df.T)}).T

对于k = 3,得出:
   0  1  2
0  A  C  B
1  A  B  C
2  C  B  D
3  D  B  A

但是我想拥有的是:
   0  1  2  3  4  5
0  A  7  C  5  B  2
1  A  3  B  3  C  1
2  C  6  B  2  D  1
3  D  9  B  6  A  3

是否有一种灵巧的方法来实现这一目标?

最佳答案

您可以使用numpy解决方案:

  • numpy.argsort 用于列名称
  • 数组已经排序(感谢Jeff),需要 values by indices
  • interweave 用于新数组
  • DataFrame构造函数

  • k = 3
    vals = df.values
    arr1 = np.argsort(-vals, axis=1)
    
    a = df.columns[arr1[:,:k]]
    b = vals[np.arange(len(df.index))[:,None], arr1][:,:k]
    
    c = np.empty((vals.shape[0], 2 * k), dtype=a.dtype)
    c[:,0::2] = a
    c[:,1::2] = b
    print (c)
    [['A' 7 'C' 5 'B' 2]
     ['A' 3 'B' 3 'C' 1]
     ['C' 6 'B' 2 'D' 1]
     ['D' 9 'B' 6 'A' 3]]
    
    df = pd.DataFrame(c)
    print (df)
       0  1  2  3  4  5
    0  A  7  C  5  B  2
    1  A  3  B  3  C  1
    2  C  6  B  2  D  1
    3  D  9  B  6  A  3
    

    关于python - 每行Pandas数据框中具有前k个列的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42533883/

    10-12 20:21