質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

3つ以上のファイルの結合

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,514

kumer1

score 26

前提・実現したいこと

(本来ならSQLなのかも知れませんが、、)pythonでも2つ以上のファイルを読み込みリレーションを用いた集計で表示結果のように出力できないかと思い取り組みました。
merge()を使って2つのファイルはうまく出来たのですが、結合するファイルが3つになったら出来なくなりました。

name.csv

Id Name City_id Job_id
1 Jun 1 1
2 Alex 1 4
3 Hiro 2 1
4 Takako 3 3
5 Naoki 4 2

city.csv

City_id City
1 NYC
2 Izu
3 Tokyo
4 SF

job.csv

Job_id Job
1 Neat
2 Programmer
3 Office Work
4 Construction

表示結果

Id Name City Job
0 1 Jun NYC Neat
1 2 Alex NYC Construction
2 3 Hiro Izu Neat
3 4 Takako Tokyo Office Work
4 5 Naoki SF Programmer

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    df4 = pd.merge(df1, df2, df3, how = 'inner', on = ['Job_id', 'City_id'])
TypeError: merge() got multiple values for argument 'how'

該当のソースコード

import csv
import pandas as pd

df1 = pd.read_csv("name.csv")
df2 = pd.read_csv("job.csv")
df3 = pd.read_csv("city.csv")
df4 = pd.merge(df1, df2, df3, how = 'inner', on = ['Job_id', 'City_id'])
df4 = df4.loc[:, ['Id', 'Name', 'City', 'Job']]
print(df4)

試したこと

色々と調べたのですが、もしかしてmerge()じゃ3つ以上のファイルを一気に処理、出来ない??

補足情報(FW/ツールのバージョンなど)

MAC OS High Sierra
ver.10.13.6
Python 3.4.3
ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

2つをマージした結果に、もう一つマージしていきましょう。
これを繰り返せばいくつでも可能になります

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

リファレンスを読みましょう

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html#pandas.merge

pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

3つ目の引数は how です。
ご自身の指摘にもあるように、3つ以上のデータフレームのマージは一度にはできません。2つずつマージしましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/18 14:20

    因みに、一度にやるにはSQL系でDBを組むのが最適なのでしょうか?

    キャンセル

  • 2019/02/18 14:26

    最適、というのは状況によって変わります。
    DBで管理されている情報であればクエリで結合した結果を出力するのが最適かと思いますが、そのためにわざわざDBを用意するほどでなければ良い選択肢とは言えない場合もあります。

    一度にやる、といいますが一つのスクリプトで複数のテーブルをJOINするという見方で考えれば原理上はpandasとSQLとでは違いがないですよ?
    SQLでもテーブルAにテーブルBをJOINして、その出来上がったテーブルに更にテーブルCをJOINして…とやっているわけですから。

    キャンセル

  • 2019/02/19 06:30

    回答、ありがとうございます。色々勉強します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る