1. ホーム
  2. python

Pandasは異なるカラムを持つ2つのデータフレームをマージする

2023-08-18 16:44:29

質問

私はきっとここで何か簡単なことを見逃しています。ほとんど同じ列名を持つpandasの2つのデータフレームをマージしようとしていますが、右のデータフレームは左が持っていないいくつかの列を持っており、その逆も同様です。

>df_may

  id  quantity  attr_1  attr_2
0  1        20       0       1
1  2        23       1       1
2  3        19       1       1
3  4        19       0       0

>df_jun

  id  quantity  attr_1  attr_3
0  5         8       1       0
1  6        13       0       1
2  7        20       1       1
3  8        25       1       1

外側joinで結合してみました。

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")

しかし、それは降伏する。

Left data columns not unique: Index([....

また、結合するカラムを1つだけ指定しました ( on = "id" など) も指定しましたが、これでは id のように attr_1_x , attr_1_y といった具合に、理想的ではありません。また、カラムのリスト全体(たくさんあります)を on :

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))

という結果が得られる。

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

何が足りないのでしょうか?私はすべての行が追加されたdfを取得したいのですが、その際 attr_1 , attr_2 , attr_3 可能な場合はpopulated、表示されない場合はNaN。これはデータマイニングの典型的なワークフローのように思えますが、私は行き詰っています。

事前にありがとうございます。

どのように解決するのですか?

私はこの場合 concat が欲しいところです。

In [12]:

pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
   attr_1  attr_2  attr_3  id  quantity
0       0       1     NaN   1        20
1       1       1     NaN   2        23
2       1       1     NaN   3        19
3       0       0     NaN   4        19
4       1     NaN       0   5         8
5       0     NaN       1   6        13
6       1     NaN       1   7        20
7       1     NaN       1   8        25

を渡すことで axis=0 では、df を互いに積み重ねています。 NaN の値を生成しています。