我正在尝试一个像这样的数据框
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 :(得分: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()
功能。如果在列表中输入用户的所有标记,然后对列表进行排序,则应找到所需的结果