对行值进行排序并显示列顺序
Sorting row values and displaying the column order
我正在尝试一个类似这样的数据框
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 中执行此操作。谢谢。
您可以使用list.sort()
功能。如果你在一个列表中输入一个用户的所有标签,然后对列表进行排序,你应该会找到想要的结果
如果您将 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
我 return 使用 .values
的 np 数组,否则本应 returned 的系列将与原始列名对齐,因此不会发生排序
此外,我必须在 Index
对象上调用 to_series
,因为您不能使用以下行改变索引对象:val[mask] = ''
我正在尝试一个类似这样的数据框
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 中执行此操作。谢谢。
您可以使用list.sort()
功能。如果你在一个列表中输入一个用户的所有标签,然后对列表进行排序,你应该会找到想要的结果
如果您将 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
我 return 使用 .values
的 np 数组,否则本应 returned 的系列将与原始列名对齐,因此不会发生排序
此外,我必须在 Index
对象上调用 to_series
,因为您不能使用以下行改变索引对象:val[mask] = ''