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

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

最佳答案

如果您将 0 值替换为 NaN,那么您可以应用 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 进行比较,因为与 float 标量值进行比较是有问题的并且可能不起作用:

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] = ''

关于python - 对行值进行排序并显示列顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37653926/

相关文章:

python - 函数不返回变量的随机整数

python - Django根据表单集中的其他两个字段计算字段

python - 如何在 Pandas 中做一系列系列

python - Scrapy 从动态表中提取数据

python - 在行 pandas python 上使用部分字符串匹配返回 DataFrame 项

python - 如何使用多个 bool 条件选择 Pandas DataFrame 中的特定列

python - 无法将日期转换为 datetime64

python - 使用 xpath selenium 查找元素

python - Django 自定义管理器 get_queryset() 不工作

python-2.7 - 使用 virtualenv 进行科学 Python 和机器学习有什么缺点吗?