我有效率问题。本质上,我有一个充满列表的数据框。每个列表都包含一个值和一个描述该值的字符串(我认为列表格式是对配对进行排序的最简单方法)。我需要分别对每行中的值进行重新排序,其中最高值在左侧,最低值在右侧。我已经找到了解决方案,但是鉴于我是一个较新的程序员,我想知道您是否认为有一种更快的方法可以执行此操作而无需遍历索引。请随时提供您的任何反馈。我唯一的要求是最终的解决方案是一个数据帧,在该数据帧中,值后面紧跟着它的字符串描述符(字符串描述符可以在其自己的相邻列中,而不必在列表中)。
启动DF:
import pandas as pd
import numpy as np
master_stop = pd.DataFrame([[[56,'Support'],[58, 'MA']],
[[24.4, 'Support'],[23.3,'MA'],[25,'MA']]],
['Symbol_1','Symbol_2']).fillna(np.NaN)
master_stop
Out[2]:
0 1 2
Symbol_1 [56, Support] [58, MA] NaN
Symbol_2 [24.4, Support] [23.3, MA] [25, MA]
我要改进的排序方法:
def sort_df():
for index in master_stop.index:
master_stop.loc[index] = master_stop.loc[index].sort_values(ascending=False).values
排序的DF:
sort_df()
master_stop
Out[3]:
0 1 2
Symbol_1 [58, MA] [56, Support] NaN
Symbol_2 [25, MA] [24.4, Support] [23.3, MA]
答案 0 :(得分:1)
使用stack
,sort_values
,sort_index
和unstack
可以完成这项工作。不是一行,而是如果你这样做
master_stack = master_stop.stack().sort_index(level=0,ascending=[True])
master_stop = (pd.Series(data = master_stack.sort_values(ascending=False).sort_index(level=0,ascending=[True]).values,
index = master_stack.index)
.unstack())
然后master_stop
将按预期排序
0 1 2
Symbol_1 [58, MA] [56, Support] NaN
Symbol_2 [25, MA] [24.4, Support] [23.3, MA]