空の列をデータフレームに追加するにはどうすればよいですか?


262

空の列をパンダDataFrameオブジェクトに追加する最も簡単な方法は何ですか?私がつまずいた最高のものはのようなものです

df['foo'] = df.apply(lambda _: '', axis=1)

それほど変な方法はありませんか?


2
空の文字列を含む列が実際に必要N/Aですか?
フィルムまたは2013年

回答:


420

私が正しく理解していれば、割り当ては次のように満たされるはずです。

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

2
この回答により、新しい行が作成されました。
logicbloke

@logicblokeは、これが起こっている例を提供できますか?
craymichael

@craymichael久しぶりですが、名前のない番号付きの列と名前付きの行があり、最後に新しい行が作成されたと思います。
logicbloke

1
dfが空の場合は、使用することができますdf['new'] = pd.Series() (下記の私の回答を参照)
Carsten

複数の空の列を追加する方法?
M.マリスカル

46

DSMの回答に追加して、この関連する質問に基づい、アプローチを2つのケースに分割します。

  • 単一の列の追加:空の値を新しい列に割り当てるだけです。たとえば、 df['C'] = np.nan

  • 複数の列の追加:.reindex(columns=[...]) パンダ方法を使用して、新しい列をデータフレームの列インデックスに追加することをお勧めします。これは、を使用して複数の新しい行を追加する場合にも機能し.reindex(rows=[...])ます。Pandasの新しいバージョン(v> 0.20)axisでは、columnsまたはに明示的に割り当てるのではなく、キーワードを指定できることに注意してくださいrows

複数の列を追加する例を次に示します。

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

または

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

また、常に新しい(空の)データフレームを既存のデータフレームに連結することもできますが、それは私にはPythonのようには感じられません:)


3
の例はversion >= 0.20.0、DataFrame を削除し、新しい列を行として追加します。version < 0.20.0Pandasバージョンで問題なく動作する例0.24.1
Lalo

@emunsingこの質問への回答を探している間に、私は最終的にあなたの回答が役に立ちました。しかし、最初は、Pandasが, axis=1で必要とするように機能しませんでしたversion = 0.25。更新されたバージョンを含めるように回答を変更しようとしましたが、@ kenlukasおよび@il_raffaによって拒否されました。私のように、あなたの応答がなぜ彼らにとってうまくいかないのか理解するのに苦労しているすべての人が、少なくともこのコメントに出くわすことを願っています。
グリフ

@Griff-バージョンの互換性の問題について、より正確で明確になるように回答を更新しました。これを強調してくれてありがとう。
通知

35

さらに簡単な解決策は次のとおりです。

df = df.reindex(columns = header_list)                

「header_list」は、表示するヘッダーのリストです。

リストに含まれ、データフレーム内にまだ見つからないヘッダーは、下の空白セルとともに追加されます。

そうなら

header_list = ['a','b','c', 'd']

次に、cとdが空白セルの列として追加されます


2
より正確には、列にはNaNが追加されます。
broccoli2000 2017

19

以降ではv0.16.0DF.assign()新しい列(割り当てるために使用することができ、単一/複数のへの)DF。これらの列は、の最後にアルファベット順に挿入されますDF

これは、返されたデータフレームで一連の連鎖操作を直接実行したい場合の単純な割り当てと比較して有利になります。

DF@DSMで示されている同じサンプルを考えてみます。

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

これは、以前に作成されたすべての列と新しく作成された列を含むコピーを返すことに注意してください。オリジナルDFをそれに応じて変更するには、現在の操作をdf = df.assign(...)サポートしていないため、:のように使用しinplaceます。


Cのそのデータ型は何ですか?文字列のリストをループして追加しようとしています。ただし、使用しません。
eleijonmarck 2017年

12

好き:

df['new'] = pd.Series(dtype='your_required_dtype')

空のデータフレームがある場合、このソリューションは、を含む新しい行NaNが追加されないようにします。

dtypeが指定されていない場合、新しいPandasバージョンはを生成しDeprecationWarningます。



4

@emunsingの答えは複数の列を追加するのに本当に素晴らしいですが、私はそれをpython 2.7で機能させることができませんでした。代わりに、私はこの作品を見つけました:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

1

以下のコードは、「既存のデータフレームにn個の空の列を追加するにはどうすればよいですか」という質問に対処します。同様の問題の解決策を1か所にまとめるために、ここに追加します。

アプローチ1(1〜64の列名で64の追加列を作成する)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

アプローチ2(1〜64の列名で64の追加列を作成する)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

1

できるよ

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 

1

を使用df.insert(index_to_insert_at, column_header, init_value)して、特定のインデックスに新しい列を挿入できます。

cost_tbl.insert(1, "col_name", "") 

上記のステートメントは、最初の列の後に空の列を挿入します。

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