我正在尝试一个类似这样的数据框
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/