1. ホーム
  2. python

[解決済み] 既存のDataFrameに新しい列を追加する方法は?

2022-03-18 21:23:29

質問

以下のようなインデックス付き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' を既存のデータフレームに追加し、データフレーム内を何も変更したくない(つまり、新しい列は常にデータフレームと同じ長さである)。

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

カラムを追加するには e を上記の例に追加してください。

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

2017年を編集する

コメントや@Alexanderの指摘にあるように、現在、DataFrameの新しいカラムとしてSeriesの値を追加する最善の方法は assign :

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


2015年を編集する
が表示されるという報告もありました。 SettingWithCopyWarning このコードで
しかし、このコードは現在のpandasバージョン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'] = pd.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

>>> pd.version.short_version
'0.16.1'

SettingWithCopyWarning は、Dataframeのコピーに無効な代入が行われた可能性があることを知らせることを目的としています。必ずしも間違ったことをしたとは言いませんが(誤検出を引き起こす可能性があります)、0.13.0からは、同じ目的のためにもっと適切な方法があることを知らせてくれます。もし警告が出たら、そのアドバイスに従えばいいのです。 .loc[row_index,col_indexer] = valueで代用してみてください。

>>> df1.loc[:,'f'] = pd.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
>>> 

実際、これは現在より効率的な方法です。 pandasのドキュメントに記載されている


オリジナルの回答です。

元のdf1インデックスを使用してシリーズを作成します。

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