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

时间:2016-06-06 09:30:25

标签: python python-2.7 pandas data-analysis

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

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中这样做。谢谢。

2 个答案:

答案 0 :(得分:1)

如果您将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

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

此外,我必须在to_series对象上致电Index,因为您无法使用此行改变Index对象:val[mask] = ''

答案 1 :(得分:-1)

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