【问题标题】:Sorting value by two columns in Pandas Python在 Pandas Python 中按两列对值进行排序
【发布时间】:2021-09-02 11:53:51
【问题描述】:

这个想法是按两列对值进行排序。 这样,给定两列,我期望输出类似于

预期输出

      x     y
0   2.0   NaN
1   3.0   NaN
2   4.0   4.1
3   NaN   5.0
4  10.0   NaN
5  24.0  24.7
6  31.0  31.4

但是,使用下面的代码

import pandas as pd
import numpy as np
df1 = pd.DataFrame ( {'x': [2, 3, 4, 24, 31, '',10],
                      'y':['','',4.1,24.7,31.4,5,'']} )
df1.replace(r'^\s*$', np.nan, regex=True,inplace=True)
rslt_df = df1.sort_values ( by=['x', 'y'], ascending=(True, True) )

print(rslt_df)

生成以下内容

      x     y
0   2.0   NaN
1   3.0   NaN
2   4.0   4.1
6  10.0   NaN
3  24.0  24.7
4  31.0  31.4
5   NaN   5.0

请注意,在最后一行,y 列的5.0 位于底部。

我可以知道对代码进行了哪些修改以获得预期的输出吗?

【问题讨论】:

  • 之所以是这样,是因为它是按X排序(nan到底部),然后是Y。

标签: python pandas sorting


【解决方案1】:

尝试按xfillnay排序,然后从这些排序值中reindex

df1.reindex(df1['x'].fillna(df1['y']).sort_values().index).reset_index(drop=True)

要更新df1 变量:

df1 = (
    df1.reindex(df1['x'].fillna(df1['y']).sort_values().index)
        .reset_index(drop=True)
)

df1:

      x     y
0   2.0   NaN
1   3.0   NaN
2   4.0   4.1
3   NaN   5.0
4  10.0   NaN
5  24.0  24.7
6  31.0  31.4

【讨论】:

    【解决方案2】:

    np.sortargsort

    df1.iloc[np.sort(df1[['x','y']],axis=1)[:,0].argsort()]
    

          x     y
    0   2.0   NaN
    1   3.0   NaN
    2   4.0   4.1
    5   NaN   5.0
    6  10.0   NaN
    3  24.0  24.7
    4  31.0  31.4
    

    【讨论】:

    • 这完全符合 OP 的意图,具有更紧凑的优势。
    • @HenryEcker,我认为你应该保留你的帖子。我从那里学到了一些东西。
    猜你喜欢
    • 2017-04-28
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多