🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

285閲覧

Python3.7.4でPandas.DataFrameの連結について教えて下さい。

coelacanth9

総合スコア8

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/10/07 11:11

編集2019/10/07 11:23

Python3.7.4でPandasを使ってデータの結合をしようとしています。

IDをキーとして複数のDataFrameを統合して一つの大きなDataFrameに入れようとしています。

テーブル1の列  :ID、A、B、C
テーブル2の列  :ID、D、E、F
テーブル3の列  :ID、G、H、I
統合テーブルの列 :ID、A、B、C、D、E、F、G、H、I

・この時、テーブル1、2、3はいづれか、またはすべて存在しない場合もありますが、統合テーブルの列としては固定でID、A、B、C、D、E、F、G、H、Iを持っておきたいです。

・また、行数が違う場合でも連結したいです。

具体的に書くとこのようなイメージです。


テーブル1
ID    A   B   C
id1  a1  b1  c1
id2  a2  b2  c2
id3  a3  b3  c3

テーブル2:なし

テーブル3
ID    G   H   I
id1  g1  h1  i1
id2  g2  h2  i2
id3  g3  h3  i3
id4  g4  h4  i4

統合テーブル(ほしい結果)
ID   A   B   C   D   E   F   G   H   I
id1 a1  b1  c1              g1  h1  i1
id2 a2  b2  c2              g2  h2  i2
id3 a3  b3  c3              g3  h3  i3
id4                         g4  h4  i4


columnDf = pd.DataFrame(columns=['ID', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'])
table1Df = pd.DataFrame({
'ID': ['id1', 'id2', 'id3'],
'A' : ['a1' , 'a2' , 'a3'],
'B' : ['b1' , 'b2' , 'b3'],
'C' : ['c1' , 'c2' , 'c3']},
index = [0, 1, 2])

table3Df = pd.DataFrame({
'ID': ['id1', 'id2', 'id3', 'id4'],
'G': ['g1' , 'g2' , 'g3' , 'g4'],
'H': ['h1' , 'h2' , 'h3' , 'h4'],
'I': ['i1' , 'i2' , 'i3' , 'i4']},
index = [0, 1, 2, 3])

#【試したこと】

concat

concatedDf = pd.concat([columnDf, table1Df, table3Df], sort=True)

A B C D E F G H I ID

0 a1 b1 c1 NaN NaN NaN NaN NaN NaN id1
1 a2 b2 c2 NaN NaN NaN NaN NaN NaN id2
2 a3 b3 c3 NaN NaN NaN NaN NaN NaN id3
0 NaN NaN NaN NaN NaN NaN g1 h1 i1 id1
1 NaN NaN NaN NaN NaN NaN g2 h2 i2 id2
2 NaN NaN NaN NaN NaN NaN g3 h3 i3 id3
3 NaN NaN NaN NaN NaN NaN g4 h4 i4 id4
となりうまくいきません。同じidのところは同じ行の該当の列に値を入れたいです。

concat その2

concatedDf = pd.concat([columnDf, table1Df, table3Df], keys=['ID'])
print(concatedDf)

結果
Empty DataFrame
Columns: [ID, A, B, C, D, E, F, G, H, I]
Index: []

merge

mergedDf = columnDf.merge(table1Df, on='ID')
mergedDf = mergedDf.merge(table3Df, on='ID')
print(mergedDf)

結果
Empty DataFrame
Columns: [A_x, B_x, C_x, D, E, F, G, H, I, ID, A_y, B_y, C_y]
Index: []


以下のような結果を得るにはどうすればいいかご教授をお願い致します。
'    ID   A    B    C    D    E    F    G     H    I
0  id1  a1   b1   c1  NaN  NaN  NaN    g1   h1   i1
1  id2  a2   b2   c2  NaN  NaN  NaN    g2   h2   i2
2  id3  a3   b3   c3  NaN  NaN  NaN    g3   h3   i3
3  id4 NaN  NaN  NaN  NaN  NaN  NaN    g4   h4   i4

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mergeで「how='outer'」を指定すれば良いかと思います。

Python

1import pandas as pd 2 3df1 = pd.DataFrame({'ID':[1,2,3],'A':['a1','a2','a3'],'B':['b1','b2','b3'],'C':['c1','c2','c3']}) 4# A B C ID 5#0 a1 b1 c1 1 6#1 a2 b2 c2 2 7#2 a3 b3 c3 3 8 9df2 = pd.DataFrame({'ID':[],'D':[],'E':[],'F':[]}) 10#Empty DataFrame 11#Columns: [D, E, F, ID] 12#Index: [] 13 14df3 = pd.DataFrame({'ID':[1,2,3,4],'G':['g1','g2','g3','g4'],'H':['h1','h2','h3','h4'],'I':['i1','i2','i3','i4']}) 15# G H I ID 16#0 g1 h1 i1 1 17#1 g2 h2 i2 2 18#2 g3 h3 i3 3 19#3 g4 h4 i4 4 20 21df4 = pd.merge(df1,df2, on='ID',how='outer') 22df4 = pd.merge(df4,df3, on='ID',how='outer') 23# A B C ID D E F G H I 24#0 a1 b1 c1 1 NaN NaN NaN g1 h1 i1 25#1 a2 b2 c2 2 NaN NaN NaN g2 h2 i2 26#2 a3 b3 c3 3 NaN NaN NaN g3 h3 i3 27#3 NaN NaN NaN 4 NaN NaN NaN g4 h4 i4

投稿2019/10/07 11:38

meg_

総合スコア10736

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coelacanth9

2019/10/08 00:38

早速のご回答ありがとうございます。 meg_さんの教えて頂いた通りでうまくいきました。 一つ確認ですが、やはり、今回で言う所のテーブル2は、なかったとしても列のみ設定した空のDataFrameを用意しておく必要はどうしてもある、という認識を持ちましたが、合っていますでしょうか? つまり、 dstDf = pd.DataFrame({'ID': [], 'A': [],'B': [],'C': [],'D': [],'E': [],'F': [],'G': [], 'H': [], 'I': []}) のような全列を持ったDataFrameをあらかじめ用意しておき、それにたいして、存在するテーブル1とテーブル3のみを結合する、という方式では、DstDfとテーブル1Df、テーブル3Dfに重複して存在する列に識別子がついた状態でマージされてしまうため、私が望んでいる結果にはならない、という認識です。
meg_

2019/10/08 01:34

キーを複数持つことも出来るので、データに合わせて色々なマージ方法はあるかと思います。merge後に、個別に列の修正しても良いと思いますし。データによりけりなので、一番効率の良いやり方を探してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問