我的数据集df
如下所示:
time Open
2017-01-01 2.2475
2017-01-02 3.2180
2017-01-03 5.2128
2017-01-04 1.2128
2017-01-05 2.2128
...., ....
2017-12-31 6.7388
我想对Open
列进行排序,但是要以递增的顺序比较第一个ROW
值。
我们将始终将1st
行值放在顶部(1st row
)上,然后通过与1st
行进行比较,以递增的顺序将low
行与最接近的值进行比较,从而对第二行进行排序。所有1.2128
值都保留在底部。例如:df
[OP寻求一种方法,其中大于选择列第一行的值应顺序出现并从第2行升至第n行,然后小于第一行的值应在n之后(所有先前的值)。]
例如,新的time Open
2017-01-01 2.2475
2017-01-05 2.2128
2017-01-02 3.2180
2017-01-03 5.2128
...., ....
2017-12-31 6.7388
2017-01-04 1.2128
为:
df.sort_values(by='Open', ascending=False)
我做了什么?
我可以按列进行排序:
column
但这是通过ROW
。现在如何按第一个2.2475
值{{1}}
答案 0 :(得分:1)
IIUC,给出了df
:
time Open
0 2017-01-01 2.2475
1 2017-01-02 3.2180
2 2017-01-03 5.2128
3 2017-01-04 1.2128
4 2017-01-05 2.2128
5 2017-12-31 6.7388
OP希望排序为row_0
,(rows greater than row_0)
,(rows smaller than row_0)
:
这可以通过使用每行与row_0之间的差异来实现:
s = df['Open'].sub(df['Open'][0]).to_dict()
df.iloc[sorted(s, key = lambda x: s.get(x) < 0)]
输出:
time Open
0 2017-01-01 2.2475
1 2017-01-02 3.2180
2 2017-01-03 5.2128
5 2017-12-31 6.7388
3 2017-01-04 1.2128
4 2017-01-05 2.2128
答案 1 :(得分:0)
OP在使用DataFrame列的第一行作为列排序拆分方法的基线的方法之后:大于此第一行的值应顺序出现并从第2行升至第n行,而小于该值那么第一行应该在n(所有前面的值)之后。
这可以通过以下功能实现:
df = pd.DataFrame({'time': ['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06'],
'Open': [2.24, 1.21, 1.51, 3.21, 5.21, 6.21]})
def pin_row_and_sort(f):
values_above = f.loc[f['Open'] >= f['Open'].iloc[0]].sort_values(by='Open')
values_below = f.loc[f['Open'] < f['Open'].iloc[0]].sort_values(by='Open')
return pd.concat([values_above, values_below])
new_frame = pin_row_and_sort(df)
我很想看到这种方法的任何改进/建议。 或者只是不投票解释原因:)