如何向数据框添加一个空列?

496

如何在pandas DataFrame对象中添加一个空列是最简单的方法?我发现最好的方法是这样的:

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

有没有更不那么歪曲的方法?


2
你是想要一个包含空字符串的列还是N/A - filmor
16个回答

741

如果我理解得正确,赋值应该填充:

>>> 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

6
这个答案让我需要添加新的行。 - logicbloke
4
如果 df 是空的,你可能需要使用 df['new'] = pd.Series()(请参见下面我的答案)。 - Carsten
5
如何添加多个空列? - M. Mariscal
14
@M.Mariscal df[["newcol1","newcol2","newcol3"]] = None - Skippy le Grand Gourou
1
@skippy-le-grand-gourou,这段代码会触发一个SettingWithCopyWarning警告。请改用以下方式:df.loc[:, ["newcol1","newcol2","newcol3"]] = np.nan - think
显示剩余6条评论

81

补充DSM答案并且结合这个相关问题,我会把方法分成两种情况:

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

  • 添加多列:我建议使用pandas中的.reindex(columns=[...])方法将新的列加入到数据框的列索引中。对于添加多行也可以使用.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

你也可以将一个新的(空)数据框与现有的数据框连接起来,但对我来说,这种方法并不像 Python 风格一样 :)


3
如果 version >= 0.20.0,则删除原始数据框并将新列添加为行。如果 version < 0.20.0,则在 Pandas 版本 0.24.1 上可以正常工作。 - Lalo
@emunsing 在寻找这个问题的答案时,我最终发现了您的答案很有帮助。然而一开始,它对我没有用,因为在version = 0.25中Pandas需要, axis=1。 我尝试修改您的答案以包括更新的版本,但被 @kenlukas 和 @il_raffa 拒绝了。我希望每个像我一样苦苦挣扎想要理解为什么您的回答对他们不起作用的人,至少能看到这条评论。 - smgeneralist
@Griff - 我已经更新了我的答案,更准确地明确了版本兼容性问题。感谢你的指出。 - emunsing

75

我喜欢:

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

# or use other dtypes like 'float', 'object', ...

如果您有一个空的数据框,此解决方案可以确保不会添加只包含NaN的新行。

指定dtype并非必须,但是较新的Pandas版本会产生DeprecationWarning,如果未指定,则需要注意。


3
这是插入预定义数据类型的新列的最佳方法。 - normanius
1
完全同意。如果出于任何原因需要将新序列的大小调整为给定的 df,则可以添加 index = df.index - Wtower

64

甚至更简单的解决方案是:

df = df.reindex(columns = header_list)                

“header_list”是您想显示的标题列表。

在该列表中包含但数据框中不存在的任何标题将显示为空白单元格。

因此,如果

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

那么,c和d将作为空单元格的列添加。


6
更精确地说,这些列将会添加上NaN值。 - broccoli2000

44

v0.16.0版本开始,可以使用DF.assign()方法向DF分配(单列/多列)新列。这些列按字母顺序插入到DF的末尾。

与简单分配相比,这在您想要对返回的数据框进行一系列链式操作的情况下变得更加优越。

考虑由@DSM演示的同样的DF样本。

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["C"] = ""
df["D"] = np.nan

赋值操作会给你一个警告 SettingWithCopyWarning:

正在尝试在 DataFrame 的切片副本上设置值。请尝试使用 .loc[row_indexer,col_indexer] = value 代替。

因此最好使用 insert

df.insert(index, column-name, column-value)

如果此答案对您有帮助,请别忘了点赞。


7

如果你想从列表中添加列名

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan

6

在特定的索引位置,可以使用df.insert(index_to_insert_at, column_header, init_value)插入新的列。

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

上述语句会在第一列后插入一个空列。


6

@emunsing的回答很酷,可以添加多列,但我在Python 2.7中无法使其工作。相反,我发现以下方法可行:

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

1
请不要使用Python 2.7... - Michael Currie

4

这也适用于多列:

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

df1 = pd.DataFrame(columns=['C','D','E'])
df = df.join(df1, how="outer")

>>>df
    A   B   C   D   E
0   1   2   NaN NaN NaN
1   2   3   NaN NaN NaN
2   3   4   NaN NaN NaN

然后,您可以使用pd.Series.fillna()pd.Series.map()等方法对列进行任何您想要的操作。


那有多高效? - Leonardo Cló
如果你在实际数据上进行连接,时间复杂度为O(n log(n)),我的假设是因为df为空,最大时间复杂度为O(n)。 - Talis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接