Exploratory コミュニティ

結合:複数データフレームの結合+上書きマージを実行したい。

#1

こんにちは。
結合について質問です。いま、元データフレームがあり、それに先データフレームを追加したいと思います。

先データフレームは、元データフレームとインデックスが重複していて、インデックスが一致するすべての行で、元と先に同じ列がある場合、先の値で上書きしたいです。

今のバージョンで左結合を行うと列が追加されます。上書きしたい場合にもっとも有効な(早く済む)ステップはどんなやり方があるでしょうか。

よろしくお願いします。

#2

元データフレームをA、先データフレームをBとします。
結合のしかたが、内部結合なのか外部結合なのかわかりませんが、
いったん、

  1. Aにしかインデックスが存在しない行はAの内容を保持する
  2. AとBのいずれにも同一インデックスが存在する場合はBの内容を保持する
  3. Bにしかインデックスが存在しない行は、捨てる

と仮定します。
まず、Aのデータフレームのブランチを作ります。

次に、(作成したブランチではない方の)Aのデータフレームの結合ステップで
Bとの「アンチ結合」を行います。
これで1ができます。

続いて、Bのデータフレームの結合ステップで、先ほど作成したAのブランチと「内部結合」を行います。
これで2ができます。

そうしたら、1または2から、もう一つのデータフレームをマージする、というやりかたでご希望のアウトプットができるのではないかと思いますがいかがでしょうか。

1 Like
#3

返信ありがとうございます。
すみません、質問の仕方が悪かったです。
再度質問させてください。

[1]
・元データフレームをA、先データフレームをBとします。
・AとBで共通する列要素が1つあるとし(例、店舗名)、その共通要素でAの左結合でBをマージします。
以上を1回目の結合とします。

[2]
次に、2回目の結合について。
・Aのデータフレームは不変、Bは列の種類や数は変わらないですが、フィールドの値(セルの値:数値)が増えたり減ったりするとします。例えばAが店舗名リスト、Bが店舗別の週間来店者数累計(週1回集計して累積した結果)などを想定していただければと思います。

[3]
同様に3回目(3週目)、4回目(4週目)も同じように毎週結合して行くとします。


ここで毎度の左結合するときにBの数値(直近値)で上書きしたいです。(Bの各列の数値は上書きされ、前のデータは消えても良いという意味です)

・いまExploratoryでAにBを左結合 するとその度ごとに(今回追加した新たな)Bの列が右にどんどん増えます。

そこで、毎回のBを左結合するたびに列を増やさずに値を上書きしたいため、何らかのステップを施したいと思いましたが、どうすれば良いかわかりませんでした。

以上、まどろっこしい質問ですみません。
お答えいただければ嬉しいです。

どうぞよろしくお願いします。

#4

詳しい状況を教えていただきありがとうございます。
具体的なデータのイメージをいまひとつ掴みかねているので、外していたらごめんなさい。
(とはいえ業務的なデータでなかなかそれを詳らかにするのは難しいですよね)

推察するに、Aは店舗マスタのようなものなのでしょうか?
だとすると、結合の順序としてAにBを結合するよりも、
ファクトテーブルであるBにマスタであるAを結合するほうがよいと思います。

スタースキーマという考え方がありまして、
集計対象となる値があるデータを基本として、
集計軸となる属性情報を付加していくやり方なのですが
なかなかわかりやすい資料が探し当たらないものの、

https://eulerdijkstra.hatenadiary.org/entry/20110424/1303620075

イメージとしてはこのページに記載されている図がわかりやすいと思います。
このやり方のほうが集計処理には適しているのです。

なお、店舗によってBに値がない場合も行として存在させたい、という場合は
Bの結合ステップの結合条件として、完全外部結合を選択すれば、
値が空白(N/A)の行を追加することができます。
※その後に集計等を行う場合は、適宜N/Aをゼロに置き換えるとよいと思います。

かなりやり方が変わるのですぐには理解が難しいかもしれませんが、
ここを超えると世界が変わります、なにとぞご検討ください。

1 Like
#5

「結合のロジックを逆さまにすればいいのでは。」まさにその通りですね、ありがとうございます。一度こちらで試してみて、何かあればご報告します。

またスキーマという名前については何度か聞いたことがありましたが、何だか遠い世界だと思って深く学習したことはなかったです。これを機会に学習してみたいと思います。

#6

おはようございます。BにAを結合とし、
こちら(完全外部結合)

なお、店舗によってBに値がない場合も行として存在させたい、という場合は
Bの結合ステップの結合条件として、完全外部結合を選択すれば、
値が空白(N/A)の行を追加することができます。

も試してみたところ、意図した状態が実現できました!
ありがとうございます!

1 Like