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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

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

Q&A

解決済

2回答

624閲覧

データフレーム結合の整形について

sham0909

総合スコア27

Python

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

0グッド

0クリップ

投稿2020/09/16 02:01

いつもお世話になります。
2点質問させていただきます。

1点目は複数のデータフレームの結合の際の整形について質問させていただきます。
以下のようなデータフレームがあった場合、B列をインデックスにして、
行を並び替える方法についてご教示願います。

以下の場合ですと、[あ、い、う、え]をインデックスにしたいですが、df1は「え」が欠損しており、
df2は「い」が欠損しており、df3は「う」が欠損しています。
その結果、結合した際に行数が合わなくなり、「あ~え」のデータを横並びにできません。
理想の形のように共通した行に合わせて、データを横並びにさせたいです。

pyhton

1import pandas as pd 2 3df1 = pd.DataFrame({"A":[1,2,3],"B":["あ","い","う"]}) 4df2 = pd.DataFrame({"A":[11,33,44],"B":["あ","う","え"]}) 5df3 = pd.DataFrame({"A":[111,333,444],"B":["あ","い","え"]}) 6df4 = pd.DataFrame({"A":[1111,2222,3333,4444],"B":["あ","い","う","え"]}) 7#一旦リスト化 8df_list=[df1,df2,df3,df4] 9#結合 10df5=pd.concat(df_list,axis=1)

df5
|index|A|B|A|B|A|B|A|B|
|:--|:--:|--:|:--|:--:|--:|
|0|1|あ|11|あ|111|あ|1111|あ|
|1|2|い|33|う|222|い|2222|い|
|2|3|う|44|え|444|え|3333|う|
|3|nan|nan|nan|nan|nan|nan|4444|え|

↓理想の形
|index|A|B|A|B|A|B|A|B|
|:--|:--:|--:|:--|:--:|--:|
|あ|1|あ|11|あ|111|あ|1111|あ|
|い|2|い|nan|nan|222|い|2222|い|
|う|3|う|33|う|nan|nan|3333|う|
|え|nan|nan|44|え|444|え|4444|え|


2点目ですが、列名が同じなので結合した際に番号を振って、
以下の様に個別化させることは可能でしょうか。

|index|A|B|A|B|A|B|A|B|
|:--|:--:|--:|:--|:--:|--:|

       ↓

|index|A1|B1|A2|B2|A3|B3|A4|B4|
|:--|:--:|--:|:--|:--:|--:|

長文失礼いたしました。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

pd.concat()は、データフレームのインデックスを基準にして結合を行います。したがってpd.concat()を用いたい場合は、各データフレームに対してB列の値を1:1対応するようなインデックスを設定する必要があります。
最も簡単な方法は、以下のように各データフレームに.set_index()を適用してB列をインデックスに設定することです。
参考:pandas.DataFrame.set_index — pandas documentation

python

1df_list = [df1, df2, df3, df4] 2 3pd.concat([df.set_index('B', drop=False) for df in df_list], 4 axis=1) 5# A B A B A B A B 6# あ 1.0 あ 11.0 あ 111.0 あ 1111 あ 7# い 2.0 い NaN NaN 333.0 い 2222 い 8# う 3.0 う 33.0 う NaN NaN 3333 う 9# え NaN NaN 44.0 え 444.0 え 4444 え

列名を区別する方法として、結合前に各データフレームの列名に接尾辞を付ける方法があります。以下の例では、各データフレームに.add_suffix()を適用して接尾辞を付与しています。
参考:pandas.DataFrame.add_suffix — pandas documentation

python

1pd.concat([df.set_index('B', drop=False).add_suffix(i+1) 2 for i, df in enumerate(df_list)], 3 axis=1) 4# A1 B1 A2 B2 A3 B3 A4 B4 5# あ 1.0 あ 11.0 あ 111.0 あ 1111 あ 6# い 2.0 い NaN NaN 333.0 い 2222 い 7# う 3.0 う 33.0 う NaN NaN 3333 う 8# え NaN NaN 44.0 え 444.0 え 4444 え

もう一つ、pd.concat()key引数を利用して結果のデータフレームをマルチインデックス構造にする方法があります。

python

1pd.concat([df.set_index('B', drop=False) for df in df_list], 2 keys=range(1, 5), 3 axis=1) 4# 1 2 3 4 5# A B A B A B A B 6# あ 1.0 あ 11.0 あ 111.0 あ 1111 あ 7# い 2.0 い NaN NaN 333.0 い 2222 い 8# う 3.0 う 33.0 う NaN NaN 3333 う 9# え NaN NaN 44.0 え 444.0 え 4444 え

投稿2020/09/16 04:33

kirara0048

総合スコア1399

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

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

sham0909

2020/09/16 06:06

基本的な内容から教えていただきありがとうございました。 内容がようやく理解できました。
guest

0

こういう格好ですか? 

python3

1import pandas as pd 2 3df1 = pd.DataFrame({"A":[1,2,3],"B":["あ","い","う"]}) 4df2 = pd.DataFrame({"A":[11,33,44],"B":["あ","う","え"]}) 5df3 = pd.DataFrame({"A":[111,333,444],"B":["あ","い","え"]}) 6df4 = pd.DataFrame({"A":[1111,2222,3333,4444],"B":["あ","い","う","え"]}) 7 8dfs = [df1,df2,df3,df4] 9for i, d in enumerate(dfs,1): 10 d = d.set_index("B", drop=False) 11 d.columns = ["A"+str(i),"B"+str(i)] 12df = pd.concat(dfs,axis=1) 13print(df) 14 15#A1 B1 A2 B2 A3 B3 A4 B4 16#あ 1.0 あ 11.0 あ 111.0 あ 1111 あ 17#い 2.0 い NaN NaN 333.0 い 2222 い 18#う 3.0 う 33.0 う NaN NaN 3333 う 19#え NaN NaN 44.0 え 444.0 え 4444 え

投稿2020/09/16 02:09

編集2020/09/16 02:20
jeanbiego

総合スコア3966

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

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

sham0909

2020/09/16 06:04

回答ありがとうございました。 df=pd.concat(dfs,axis=1)では元のデータフレームになってしまいますので、 修正すれば思った結果になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問