在两列之间单独对每行进行排序

时间:2016-08-11 09:25:22

标签: python sorting pandas dataframe multiple-columns

我有以下pandas数据帧:

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进行比较,看看哪个按字母顺序排在第一位,并在必要时进行交换。唯一的问题是数据帧非常大( 1百万行),所以这不是一种非常有效的方法。

有没有办法在不分别迭代每一行的情况下做到这一点?

1 个答案:

答案 0 :(得分:2)

您可以使用:

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