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
ますc
。b
これを回避するには、行を元の順序でグループ化し、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')
どちらの方法も明らかに少し無駄が多く、不器用なようです... ですから、先ほど言ったように、現時点では私が気づいていないだけで、もっと良い答えがあることを願っています。 でも、そうでなくても、これで大丈夫です。