对行值进行排序并显示列

2024-04-19 19:10:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我需要对每一行的column值进行排序,得到每一行的最大值和递减值的结果列,还需要为特定用户删除值为0的列。输出应该像这样。你知道吗

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

或者将其转置也会起作用。我需要用python2.7来做这个。非常感谢。你知道吗


Tags: 数据用户name排序columnuseruser1tag1
2条回答

您可以使用list.sort()函数。如果在列表中输入某个用户的所有标记,然后对列表进行排序,则应该会找到所需的结果

如果将0值替换为NaN,则可以applya 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

我使用.values返回一个np数组,因为否则将返回的序列将与原始列名对齐,因此不会发生排序

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

相关问题 更多 >