Python 使用各自的列名从数据帧的每行中获取前N个值

Python 使用各自的列名从数据帧的每行中获取前N个值,python,pandas,dataframe,sorting,series,Python,Pandas,Dataframe,Sorting,Series,这是我正在处理的数据帧的一个示例。我的原始数据框中有大约200个类,大约85000行,对于我的数据框的每一行,我想找出前3个类别,它们的值按降序排列: Index Class 1 Class 2 Class 3 Class 4 Class 5 0 0.95693475 0.252198994 0.0 0.3358945

这是我正在处理的数据帧的一个示例。我的原始数据框中有大约200个类,大约85000行,对于我的数据框的每一行,我想找出前3个类别,它们的值按降序排列:

Index          Class 1               Class 2         Class 3         Class 4          Class 5  
0              0.95693475            0.252198994      0.0            0.335894585      0.611441553
1              0.473615974           0.0              0.510585248    0.5007305        0.975620011
2              0.224682823           0.122315248      0.6407305        0.0            0.872211390

注意:预期输出中的List和dict只是为了参考而添加的,只需要输出数据框中每行的前3名分数及其类别名称。有人能帮我写这篇参考资料吗

从dict返回前n个键值对

从itertools导入islice
def取数(n,iterable):
返回列表(islice(iterable,n))
删除索引列

df.drop('Index',轴=1,在位=True)
函数,可应用于所有行以查找最前面的3个类别

topN
函数将作为输入参数的
row
:它将是数据帧的一行,
n
:表示要提取的最顶层元素的数量

def topN(第行,第n行):
x=行。to_dict()#将输入行转换为字典
x={k:v代表k,v在已排序(x.items(),key=lambda item:-item[1])}#根据它们的值对字典进行排序
n_items=take(n,x.items())#从字典中提取前n个值
返回n_项
n=3#所需元件数量
df['X']=df.apply(lambda行:topN(行,n),轴=1)
输出:

将存储一个新列
X
,其结果为字典。也可以将列转换为数组

    Expected output:
    Row 0: [{Class 1 : 95693475}, {Class 5: 0.611441553}, {Class 4: 0.335894585}]
    Row 1: [{Class 5 : 0.975620011}, {Class 3: 0.510585248}, {Class 4: 0.5007305}]
etc etc...
使用
0.0
删除所有值的示例:

Class 1 Class 2 Class 3 Class 4 Class 5 X
0   0.956935    0.252199    0.000000    0.335895    0.611442    [(Class 1, 0.95693475), (Class 5 , 0.61144155...
1   0.473616    0.000000    0.510585    0.500731    0.975620    [(Class 5 , 0.975620011), (Class 3, 0.5105852...
2   0.224683    0.122315    0.640730    0.000000    0.872211    [(Class 5 , 0.87221139), (Class 3, 0.6407305)...


到目前为止你都试了些什么@Erich?谢谢你。你能解释一下你的topN功能吗。同样在一行中,如果除了值1.0之外,所有的值都是0.0,那么如何只获取1个输入,即场景的1.0,而不是解释的3个输出。我想了解为什么要在将x分配给已排序字典的行中执行x.items。另外,在尝试用0.0筛选键时,我尝试了以下代码
x={k:v代表k,v在排序中(x.items()如果v!='0.0',key=lambda item:-item[1])}
但是它给了我一个语法错误。关于如何解决这个问题,我有什么想法吗?字典通常是不可编辑的,我们可以使用
.items()
来迭代它。为了使代码更简单,请在排序行之前删除
0.0
。不要更改字典排序的行。在此之前,请包含另一行:
x={k:v代表k,x.items()中的v如果v}
,其中只能包含字典中具有非零值的键。参考我答案底部的例子。
d = {1:0.0, 2:0.0, 3:1.0}
x={k:v for k,v in d.items() if v}
x # prints {3: 1.0}