パンダのデータフレームに列を追加する


104

これはおそらく簡単ですが、次のデータがあります。

データフレーム1:

index dat1
0     9
1     5

データフレーム2:

index dat2
0     7
1     6

次の形式のデータフレームが必要です。

index dat1  dat2
0     9     7
1     5     6

このappend方法を試してみましたが、クロス結合(つまり、デカルト積)を取得しました。

これを行う正しい方法は何ですか?


2
joinメソッドを試しましたか?
BrenBarn 2013

1
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@lowtech:インデックスが適切にペアリングされていることを確認していますか?
BenDundee 2013

@BenDundee:はい、そうです
lowtech

回答:


130

一般的に、あなたは単に参加を探しているようです:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

45
またはpd.concat([dat1, dat2], axis=1)この場合。
DSM

2
@BenDundee Joinとconcatは内部で同じコードを多く使用するため、「正しい」方法が重要になるのは、エッジケースを検討する場合のみです。たとえば、両方のDataFrameに「データ」列があった場合、結合は失敗しますが、連結では「データ」という名前の2つの列が得られます。
U2EF1 2013

@ U2EF1:私の対あなたの反応について話していました。猫の皮を剥ぐ方法は常にN通りあります:)
BenDundee 2013

@BenDundeeなるほど。ただし、この方法では一意のインデックスが破棄され、さらに複雑なケースではさらに奇妙な副作用が発生します。たとえば、「data」という名前の列が2つある場合、グループ化/合計が異なるデータ列の合計を開始しますが、これはほぼ確実に望ましいことではありません。文字列データは連結されます。
U2EF1 2013

1
@ jeremy-zで指摘されているように、同じインデックスを共有していない場合は、両方のデータセットのインデックスをリセットすることが非常に重要です。そうでない場合、多くのNaN行を持つ1つのデータセットを取得します。
イスラエルヴァーレア

57

次のものも使用できます。

dat1 = pd.concat([dat1, dat2], axis=1)

1
に遭遇した場合InvalidIndexError: Reindexing only valid with uniquely valued Index objects 、以下を使用できますpd.concat([dat1.reset_index(), dat2], axis=1)
。– beyondfloatingpoint

40

どちらjoin()concat()方法は、問題を解決することができます。:しかし、私は言及する必要が1警告が表示されます前に、インデックスをリセットしjoin()たりconcat()、あなたが別のデータフレームから一部の行を選択することにより、いくつかのデータフレームを扱うしようとしています。

以下の1つの例は、joinおよびconcatの興味深い動作を示しています。

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

よく言って、良い点。インデックスをリセットせずに試してみると、たくさんのNULLが生成されました
Anand

リセット手順を実行しなかった場合、データは正常に表示されましたが、裏で何かがうまく機能しなかったのは明らかです。指摘してくれてありがとう!リセットすると、モデルが起動して実行されました!
Ionuț Ciuta

これは受け入れられる答えになるはずです!インデックスをリセットしない場合、常にNaNが生成されます。
Srivatsan

このステップは私を救いました。concatとjoinのどちらが多くのNaNをスローするのかを理解しようとしていました。これを共有してくれてありがとう。
Gustavo Rottgering


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.