对行值进行排序并显示列顺序

Sorting row values and displaying the column order

我正在尝试一个类似这样的数据框

user_name   tag1   tag2   tag3   tag4
    user1    .65    .32    .91      0
    user2    .34    .44    .21    .56
    user3    .21      0      0    .19

我需要根据列的值对每一行进行排序,并获得每行具有最高值和递减值的结果列,还需要为特定用户删除具有 0 值的列。 .输出应该是这样的。

user_name       0      1      2     3
    user1    tag3   tag1   tag2  
    user2    tag4   tag2   tag1   tag3
    user3    tag1   tag4          

或对其进行转置也可以。我需要在 python2.7 中执行此操作。谢谢。

您可以使用list.sort()功能。如果你在一个列表中输入一个用户的所有标签,然后对列表进行排序,你应该会找到想要的结果

如果您将 0 值替换为 NaN,那么您可以 apply 一个 lambda 来屏蔽索引:

In [28]:
df.replace(0,np.NaN, inplace=True)
def func(x):
    val = x.sort_values(ascending=False).index.to_series()
    mask = pd.isnull(x)
    val[mask] = ''
    return val.values
df.ix[:, 'tag1':] = df.ix[:, 'tag1':].apply(lambda x: func(x), axis=1)
df

Out[28]:
  user_name  tag1  tag2  tag3  tag4
0     user1  tag3  tag1  tag2      
1     user2  tag4  tag2  tag1  tag3
2     user3  tag1  tag4            

我在这里使用 NaN 而不是与 0 进行比较,因为与浮点标量值进行比较是有问题的并且可能不起作用:

In [32]:
def func(x):
    val = x.sort_values(ascending=False).index.to_series()
    mask = val == 0
    val[mask] = ''
    return val.values
df.ix[:, 'tag1':] = df.ix[:, 'tag1':].apply(lambda x: func(x), axis=1)
df

Out[32]:
  user_name  tag1  tag2  tag3  tag4
0     user1  tag3  tag1  tag2  tag4
1     user2  tag4  tag2  tag1  tag3
2     user3  tag1  tag4  tag3  tag2

我 return 使用 .values 的 np 数组,否则本应 returned 的系列将与原始列名对齐,因此不会发生排序

此外,我必须在 Index 对象上调用 to_series,因为您不能使用以下行改变索引对象:val[mask] = ''