Python 如何将空列添加到数据帧?

Python 如何将空列添加到数据帧?,python,pandas,Python,Pandas,向数据框添加空列的最简单方法是什么?我偶然发现的最好的东西是 df['foo'] = df.apply(lambda _: '', axis=1) 是否有一种不那么反常的方法?如果我理解正确,作业应填写: >>> import numpy as np >>> import pandas as pd >>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]}) >>> df A

向数据框添加空列的最简单方法是什么?我偶然发现的最好的东西是

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

是否有一种不那么反常的方法?

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

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

为了补充DSM的答案并以此为基础,我将该方法分为两种情况:

  • 添加单个列:只需为新列指定空值,例如
    df['C']=np.nan

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

以下是添加多个列的示例:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])
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


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

v0.16.0开始,可以用于将新列(单个/多个)分配给
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
操作。

@emunsing对于添加多个列来说非常酷,但我无法在python 2.7中使用它。相反,我发现这是可行的:

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

更简单的解决方案是:

df = df.reindex(columns = header_list)                
其中“header_list”是要显示的标题列表

数据框中未找到的列表中包含的任何标题将添加以下空白单元格

所以如果

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

然后,如果要从列表中添加列名,则c和d将添加为带有空白单元格的列

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

df['new']=pd.Series(dtype='your\u required\u dtype')
如果数据框为空,此解决方案确保不添加仅包含
NaN
的新行


严格来说,指定
dtype
不是必需的,但是较新的Pandas版本会在未指定的情况下产生
DeprecationWarning

下面的代码解决了“如何将n个空列添加到现有数据帧”的问题。为了将类似问题的解决方案放在一个地方,我在这里添加了它

方法1(使用1-64中的列名创建64个附加列)

方法2(使用1-64中的列名创建64个附加列)

你能行

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 

可以使用
df.insert(index\u to\u insert\u at,column\u header,init\u value)
在特定索引处插入新列

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

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

很抱歉,我在开始时没有很好地解释我的答案。还有另一种方法可以将新列添加到现有数据帧中。 第一步,创建一个名为df_temp的新空数据框(包含数据框中的所有列,以及要添加的新列或少数列) 第二步,将df_temp和数据帧结合起来

df_temp = pd.DataFrame(columns=(df_null.columns.tolist() + ['empty']))
df = pd.concat([df_temp, df])
这可能是最好的解决办法,但这是思考这个问题的另一种方式

我使用此方法的原因是因为我一直收到此警告:

: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df["empty1"], df["empty2"] = [np.nan, ""]
太好了我找到了禁用警告的方法

pd.options.mode.chained_assignment = None 

我寻找这种解决方案的原因只是在多个DFs之间添加空格,这些DFs使用pd.concat函数按列连接,然后使用xlsxwriter写入excel

df[' ']=df.apply(lambda _: '', axis=1)
df_2 = pd.concat([df,df1],axis=1)                #worked but only once. 
# Note: df & df1 have the same rows which is my index. 
#
df_2[' ']=df_2.apply(lambda _: '', axis=1)       #didn't work this time !!?     
df_4 = pd.concat([df_2,df_3],axis=1)
然后,我将第二个lambda调用替换为

df_2['']=''                                 #which appears to add a blank column
df_4 = pd.concat([df_2,df_3],axis=1)
我测试它的输出是使用xlsxwriter到excel。 Jupyter空白列看起来与excel中的相同,但没有xlsx格式。
不确定第二个Lambda调用为何不起作用。

这也适用于多个列:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])
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()

等等。

你真的想要一个包含空字符串的列吗,或者更确切地说是
N/a
?你能解释一下为什么你想要创建一个空列,而不是仅仅组装一个值列表并直接在末尾赋值吗?更准确地说,这些列将添加NaN。C的数据类型是什么?我试图通过循环字符串列表来添加。例如,
version>=0.20.0
删除数据框并将新列作为行添加。
version<0.20.0
的示例在Pandas版本
0.24.1
@emunsing上运行良好在搜索此问题的答案时,我最终发现您的答案很有用。然而,一开始它对我不起作用,因为熊猫需要
,axis=1
版本=0.25
中。我试图修改您的答案以包含更新版本,但被@kenlukas和@il_raffa拒绝。我希望每个努力理解你的回答为什么对他们不起作用的人——就像我一样——至少会遇到这样的评论。@Griff-我现在更新了我的答案,以便更准确、更明确地说明版本兼容性问题。谢谢你强调这一点。这个答案刚刚为我创建了新行。@logicbloke你能提供一个发生这种情况的例子吗?如果
df
是空的,你可能想使用
df['new']=pd.Series()
(见下面我的答案)如何添加多个空列?@M.Mariscal
df[[“newcol1”、“newcol2”、“newcol3”]=无
。好的,所以。。。确保在给出答案时,请给出
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