Python 使用各自的列名从数据帧的每行中获取前N个值
这是我正在处理的数据帧的一个示例。我的原始数据框中有大约200个类,大约85000行,对于我的数据框的每一行,我想找出前3个类别,它们的值按降序排列: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
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}