【问题标题】:Sort each row individually between two columns在两列之间分别对每一行进行排序
【发布时间】:2016-12-17 22:56:48
【问题描述】:

我有以下熊猫数据框:

column_01   column_02   value  
ccc         aaa         1
bbb         ddd         34
ddd         aaa         98

我需要重新组织数据框,使column_01 包含在column_01column_02 之间按字母顺序排列的第一个值。上述示例的输出将是:

column_01   column_02   value
aaa         ccc         1
bbb         ddd         34
aaa         ddd         98

我显然可以通过一次遍历数据帧一行来做到这一点,将column_01column_02 进行比较,看看哪个按字母顺序排在第一位,并在必要时交换它们。唯一的问题是数据框非常大(超过 100 万 行),所以这不是一种非常有效的方法。

有没有一种方法可以在不单独遍历每一行的情况下做到这一点?

【问题讨论】:

    标签: python sorting pandas dataframe multiple-columns


    【解决方案1】:

    你可以使用:

    df[['column_01','column_02']] = 
    df[['column_01','column_02']].apply(lambda x: sorted(x.values), axis=1)
    print (df)
       column_01 column_02  value
    0       aaa       ccc      1
    1       bbb       ddd     34
    2       aaa       ddd     98
    

    另一种解决方案:

    df[['column_01','column_02']] = pd.DataFrame(np.sort(df[['column_01','column_02']].values), 
                                     index=df.index, columns=['column_01','column_02'])
    

    仅适用于 numpy 数组:

    df[['column_01','column_02']] = np.sort(df[['column_01','column_02']].values)
    print (df)
      column_01 column_02  value
    0       aaa       ccc      1
    1       bbb       ddd     34
    2       aaa       ddd     98
    

    第二种方案更快,因为apply使用循环:

    df = pd.concat([df]*1000).reset_index(drop=True)
    In [177]: %timeit df[['column_01','column_02']] = pd.DataFrame(np.sort(df[['column_01','column_02']].values), index=df.index, columns=['column_01','column_02'])
    1000 loops, best of 3: 1.36 ms per loop
    
    In [182]: %timeit df[['column_01','column_02']] = np.sort(df[['column_01','column_02']].values)
    1000 loops, best of 3: 1.54 ms per loop
    
    In [178]: %timeit df[['column_01','column_02']] = (df[['column_01','column_02']].apply(lambda x: sorted(x.values), axis=1))
    1 loop, best of 3: 291 ms per loop
    

    【讨论】:

    • 感谢您的回复。我应该更清楚,数据框中还有其他列。但我只需要将它应用于 column_01 和 column_02。我将如何考虑到这一点?我会更新我原来的问题。
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 2021-08-26
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多