Python pandasで既存のDataFrameに新しい列を追加する [Python]

このエントリーをはてなブックマークに追加

質問:

名前付きの列と、連続数じゃないような列を持つ次のようなインデックス付きDataFrameがある:

a b c d
2 0.671399 0.101208 -0.181532 0.241273
3 0.446172 -0.243316 0.051767 1.577318
5 0.614758 0.075793 -0.451460 -0.012493

既存のデータフレームに新しい列「e」を追加したいんだけど、でもデータフレームは何も変更したくないんだ(つまり、新しい列には常にDataFrameと同じ長さ)。

0 -0.335485
1 -1.166658
2 -0.385571
dtype: float64

joinappendmergeのいろんなバージョンを試したけど、望んでいた結果は得られず、せいぜいエラーになるだけ。上記の例で「e」列を追加するにはどうしたらいいかな?

By tomasz74 | 質問日時: 2012年9月23日 19:00



回答1:

元のdf1のインデックスを使用してSeriesを作ればいいよ。

df1['e'] = Series(np.random.randn(sLength), index=df1.index)

2015年 編集
ある人は、上のコードで SettingWithCopyWarningが出るっていってるけど、このコードは現在のパンダバージョン0.16.1でも完璧に動作してるよ。

>>> sLength = len(df1['a'])
>>> df1
a b c d
6 -0.269221 -0.026476 0.997517 1.294385
8 0.917438 0.847941 0.034235 -0.448948
>>> df1['e'] = p.Series(np.random.randn(sLength), index=df1.index)
>>> df1
a b c d e
6 -0.269221 -0.026476 0.997517 1.294385 1.757167
8 0.917438 0.847941 0.034235 -0.448948 2.228131
>>> p.version.short_version
'0.16.1'

SettingWithCopyWarningは、Dataframeのコピーへのおそらく無効な割り当てを通知することを目的としてる。必ずしもそれは君が間違ったやり方をしてるとは限らないよ(それはfalse positive、偽陽性かもしれないので)。でも、0.13.0以降のものではもっと良い方法がいっぱいある、って注意しようとしてるだけ。。なので、警告が表示された場合は、そのアドバイスに従って: .loc[row_index、col_indexer] = valueを代わりに使ってみて

>>> df1.loc[:,'f'] = p.Series(np.random.randn(sLength), index=df1.index)
>>> df1
a b c d e f
6 -0.269221 -0.026476 0.997517 1.294385 1.757167 -0.050927
8 0.917438 0.847941 0.034235 -0.448948 2.228131 0.006109
>>>

2017年 編集
他の人も行ってるけど、現時点でベストな方法はassignを使うことみたい:

df1 = df1.assign(e=p.Series(np.random.randn(sLength)).values)

実際、これは今のところより効率的な方法だよ。

 

By joaquin | 回答日時: 2012年9月23日 19:24



回答2:

これが、新しい列を追加する簡単な方法だよ!: df ['e'] = e

By Kathirmani Sukumar | 回答日時: 2012年12月12日 16:04



Source: Adding new column to existing DataFrame in Python pandas

共有 コメント