如何将空列添加到数据框?


260

向熊猫DataFrame对象添加空列的最简单方法是什么?我偶然发现的最好的东西是

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

有没有那么不合常理的方法?


2
您实际上是否想要包含空字符串的列N/A
电影手

Answers:


419

如果我理解正确,则应填写作业:

>>> 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() (请参阅下面的答案)
卡斯滕

如何添加多个空列?
M. Mariscal

46

为了增加DSM的答案并以这个相关问题为基础,我将该方法分为两种情况:

  • 添加单个列:只需将空值分配给新列,例如 df['C'] = np.nan

  • 添加多个列:我建议使用.reindex(columns=[...]) pandas方法将新列添加到数据框的列索引中。这也适用于使用添加多个新行.reindex(rows=[...])。请注意,较新版本的Pandas(v> 0.20)允许您指定axis关键字,而不是显式分配给columnsrows

这是添加多列的示例:

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

要么

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

您还可以始终将新的(空)数据框连接到现有数据框,但这对我来说并不像pythonic那样:)


3
用于version >= 0.20.0删除DataFrame并将新列添加为行的示例。version < 0.20.0在Pandas版本上效果很好的示例0.24.1
Lalo

@emunsing在寻找该问题的答案时,我最终发现您的答案很有帮助。起初,但是,它不是为我工作作为大熊猫需要, axis=1version = 0.25。我试图修改您的答案以包括更新的版本,但被@kenlukas和@il_raffa拒绝。我希望每个人都在努力理解为什么您的答复对他们不起作用(就像我以前那样),至少会遇到此评论。
格里夫(Griff)

@Griff-我现在更新了我的答案,以更加准确和明确地说明版本兼容性问题。感谢您强调这一点。
发出消息

35

一个更简单的解决方案是:

df = df.reindex(columns = header_list)                

其中“ header_list”是要显示的标题的列表。

列表中包含的,在数据​​框中尚未找到的所有标头都将添加以下空白单元格。

因此,如果

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

然后将c和d添加为具有空白单元格的列


2
更准确地说,这些列将添加NaN。
broccoli2000

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

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-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", "") 

上面的语句将在第一列之后插入一个空列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.