【问题标题】:Find names of top-n highest-value (non-zero) columns in each pandas dataframe row在每个 pandas 数据帧行中查找前 n 个最高值(非零)列的名称
【发布时间】:2017-04-23 07:12:43
【问题描述】:

假设我有像

这样的数据框
id     p1 p2 p3 p4  
1      0  9  0  4
2      0  0  0  4
3      1  3 10  7
4      1  5  3  1
5      2  3  7 10

希望在每个 pandas 数据框行中查找前 n 个最高值列的列名,并希望从前 3 个中排除零值。

id top1 top2 top3
1  p2   p4   
2  p4      
3  p3   p4   p2
4  p2   p3   p4/p1
5  p4   p3   p2

目前的解决方案返回的列名也为零。有没有办法排除零值。有这个解决方案

arank = df.apply(np.argsort, axis = 1)
ranked_cols = df.columns.to_series()[arank.values[:,::-1][:,:3]]
new_df = pd.DataFrame(ranked_cols, index=df.index)

还有其他解决方案,例如Find names of top-n highest-value columns in each pandas dataframe row。可以修改这些以排除具有零值的列吗?

【问题讨论】:

    标签: python pandas dataframe top-n


    【解决方案1】:

    您需要重新排序values by column names,并将0 替换为mask 以清空字符串:

    df = df.set_index('id')
    
    k = 3
    vals = df.values
    arr1 = np.argsort(-vals, axis=1)
    
    print (vals[np.arange(len(df.index))[:,None], arr1][:,:k])
    [[ 9  4  0]
     [ 4  0  0]
     [10  7  3]
     [ 5  3  1]
     [10  7  3]]
    
    a = df.columns[arr1[:,:k]]
    mask = vals[np.arange(len(df.index))[:,None], arr1][:,:k] == 0
    print (mask)
    [[False False  True]
     [False  True  True]
     [False False False]
     [False False False]
     [False False False]]
    
    result = pd.DataFrame(a, columns=['top{}'.format(i) for i in range(1, k+1)],
                             index=df.index)
    
    result = result.mask(mask, '')
    print(result)
       top1 top2 top3
    id               
    1    p2   p4     
    2    p4          
    3    p3   p4   p2
    4    p2   p3   p1
    5    p4   p3   p2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 2013-12-13
      • 2020-11-23
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      相关资源
      最近更新 更多