パンダのマージで順序を維持するにはどうすればいいですか? 質問する

パンダのマージで順序を維持するにはどうすればいいですか? 質問する

pandas に 2 つの DataFrame があり、それらをマージしようとしています。しかし、pandas は順序を変更し続けます。インデックスを設定したり、リセットしたりしてみましたが、何をしても、返される出力の行が同じ順序になることはありません。コツはありますか? ローンの順序は「a、b、c」から始まりますが、マージ後は「a、c、b」になります。

import pandas
loans = [  'a',  'b', 'c' ]
states = [  'OR',  'CA', 'OR' ]
x = pandas.DataFrame({ 'loan' : loans, 'state' : states })
y = pandas.DataFrame({ 'state' : [ 'CA', 'OR' ], 'value' : [ 1, 2]})
z = x.merge(y, how='left', on='state')

しかし、順序は元の「a、b、c」ではなくなりました。何かアイデアはありますか? 私は pandas バージョン 11 を使用しています。

ベストアンサー1

誰かがもっと良い答えを出してくれることを願いますが、もし誰も出してくれないとしても、これは間違いなくうまくいくでしょう。

Zeroth、単にソートされるのではなくloan何でも元の順序は でありx、列の順序と関係があるかどうかはわかりませんloan。(そうでない場合、問題はより簡単になりますが、面白みが薄くなります。)

まず、結合キーに基づいて並べ替えるように要求します。ドキュメント(バージョン 2.2) 説明します。これは、引数を渡さない場合のデフォルトですsort

選別:bool、デフォルトはFalse

結果の DataFrame で結合キーを辞書順に並べ替えます。False の場合、結合キーの順序は結合タイプ (how キーワード) によって異なります。

どうやって:{'left'、'right'、'outer'、'inner'、'cross'}、デフォルトは'inner'

実行するマージのタイプ。

  • left: SQL の左外部結合と同様に、左フレームのキーのみを使用します。キーの順序を保持します。

  • right: SQL の右外部結合と同様に、右フレームのキーのみを使用します。キーの順序を保持します。

  • outer: SQL の完全外部結合と同様に、両方のフレームのキーの結合を使用します。キーを辞書順に並べ替えます。

  • inner: SQL の内部結合と同様に、両方のフレームのキーの交差を使用します。左側のキーの順序を保持します。

  • cross: 両方のフレームから直積を作成し、左側のキーの順序を保持します。


第二に、もしあなたがしない結合キーに基づいて並べ替えると、行はグループ化され、同じソース行から結合された 2 つの行が隣り合うようになります。つまり、、、が引き続き取得されaますcb

これを回避するには、行を元の順序でグループ化し、x再度 をマージするだけですx(どちら側でもかまいません)。または、x必要に応じて に基づいて再インデックスを作成します。次のようになります。

x.merge(x.merge(y, how='left', on='state', sort=False))

あるいは、 を使って x-index を詰め込みreset_index、次のようにそれに基づいて並べ替えることもできます。

x.reset_index().merge(y, how='left', on='state', sort=False).sort('index')

どちらの方法も明らかに少し無駄が多く、不器用なようです... ですから、先ほど言ったように、現時点では私が気づいていないだけで、もっと良い答えがあることを願っています。 でも、そうでなくても、これで大丈夫です。

おすすめ記事