在数据框中查找每一行的前N列

发布于 2021-01-29 16:24:35

给定一个具有一个描述性列和X个数字列的数据框,对于每一行,我想标识出前N个具有较高值的​​列,并将其另存为新数据框中的行。

例如,考虑以下数据框:

df = pd.DataFrame()
df['index'] = ['A', 'B', 'C', 'D','E', 'F']
df['option1'] = [1,5,3,7,9,3]
df['option2'] = [8,4,5,6,9,2]
df['option3'] = [9,9,1,3,9,5]
df['option4'] = [3,8,3,5,7,0]
df['option5'] = [2,3,4,9,4,2]

在此处输入图片说明

我想输出(假设N为3,所以我想要前3个):

A,option3
A,option2
A,option4

B,option3
B,option4
B,option1

C,option2
C,option5
C,option4 (or option1 - ties arent really a problem)

D,option5
D,option1
D,option2

and so on....

知道如何轻松实现吗?谢谢

关注者
0
被浏览
149
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您只想配对:

    from operator import itemgetter as it
    from itertools import repeat
    n = 3
    
     # sort_values = order pandas < 0.17
    new_d = (zip(repeat(row["index"]), map(it(0),(row[1:].sort_values(ascending=0)[:n].iteritems())))
                     for _, row in df.iterrows())
    for row in new_d:
        print(list(row))
    

    输出:

    [('B', 'option3'), ('B', 'option4'), ('B', 'option1')]
    [('C', 'option2'), ('C', 'option5'), ('C', 'option1')]
    [('D', 'option5'), ('D', 'option1'), ('D', 'option2')]
    [('E', 'option1'), ('E', 'option2'), ('E', 'option3')]
    [('F', 'option3'), ('F', 'option1'), ('F', 'option2')]
    

    这也维持秩序。

    如果要列表列表:

    from operator import itemgetter as it
    from itertools import repeat
    n = 3
    
    new_d = [list(zip(repeat(row["index"]), map(it(0),(row[1:].sort_values(ascending=0)[:n].iteritems()))))
                     for _, row in df.iterrows()]
    

    输出:

    [[('A', 'option3'), ('A', 'option2'), ('A', 'option4')],
    [('B', 'option3'), ('B', 'option4'), ('B', 'option1')], 
    [('C', 'option2'), ('C', 'option5'), ('C', 'option1')], 
    [('D', 'option5'), ('D', 'option1'), ('D', 'option2')], 
    [('E', 'option1'), ('E', 'option2'), ('E', 'option3')],
    [('F', 'option3'), ('F', 'option1'), ('F', 'option2')]]
    

    或使用python排序:

    new_d = [list(zip(repeat(row["index"]), map(it(0), sorted(row[1:].iteritems(), key=it(1) ,reverse=1)[:n])))
                         for _, row in df.iterrows()]
    

    实际上这是最快的,如果您真的想要字符串,则可以随意格式化输出格式。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看