如何使用第一行的值拆分一列?

时间:2019-07-24 05:53:05

标签: python python-3.x pandas sorting dataframe

我的数据集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}}

进行排序

2 个答案:

答案 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)

我很想看到这种方法的任何改进/建议。 或者只是不投票解释原因:)