【问题标题】:Sorting row values and displaying the column order对行值进行排序并显示列顺序
【发布时间】:2016-06-06 09:30:24
【问题描述】:

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

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 中执行此操作。谢谢。

【问题讨论】:

  • 这是pandas 如果是的话添加标签
  • 将@EdChum 添加到此站点。对代码有帮助吗?

标签: python python-2.7 pandas data-analysis


【解决方案1】:

如果您将0 值替换为NaN,那么您可以通过applylambda 来屏蔽索引:

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 将与原始列名对齐,因此不会发生排序

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这里显示的标签例如有大号。标签数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2018-08-19
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多