2016-08-11 1 views
1

の間で個別にそれぞれの行は、私は、次のパンダのデータフレームがあります。ソート2列

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

を私がcolumn_01が今まで値がcolumn_01column_02間アルファベット順で最初に来るこれを含有するように再編成するデータフレームにする必要があります。上の例の出力は次のようになります。私は明らかに最初のアルファベット順で来るかを確認するためにcolumn_02からcolumn_01を比較し、必要に応じて交換する、一度にデータフレーム1行を反復処理することによってこれを行うことができ

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

。これの唯一の問題は、データフレームが非常に大きい(1m2の行)ため、これは非常に効率的な方法ではありません。

各行を個別に反復することなくこれを行う方法はありますか?

答えて

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の配列を持つ:apply使用がループので

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 

第二の溶液は、高速です:

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 
+0

返信いただきありがとうございます。データフレームには他の列もあります。しかし、私はこれをcolumn_01とcolumn_02に適用​​するだけです。それをどのように考慮に入れますか?私は元の質問を更新します。 – darkpool

+0

私の編集を参照してください、私は別の解決策も追加します。 – jezrael

+0

優秀、ありがとうございます。 – darkpool