向pandas DataFrame对象添加空列的最简单方法是什么?我碰到的最好的是

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

有没有更合理的方法?


当前回答

如果你有一个列列表,你想要为空,你可以使用赋值,然后理解字典,然后字典解包。

>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> nan_cols_name = ["C","D","whatever"]
>>> df.assign(**{col:np.nan for col in nan_cols_name})

   A  B   C   D  whatever
0  1  2 NaN NaN       NaN
1  2  3 NaN NaN       NaN
2  3  4 NaN NaN       NaN

如果希望不同列有不同的值,还可以在解包的字典中解包多个字典。

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
nan_cols_name = ["C","D","whatever"]
empty_string_cols_name = ["E","F","bad column with space"]
df.assign(**{
    **{col:np.nan for col in my_empy_columns_name}, 
    **{col:"" for col in empty_string_cols_name}
            }
         )

其他回答

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

df = df.reindex(columns = header_list)                

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

列表中包含的任何标题,如果在数据帧中没有找到,将在下面添加空白单元格。

因此,如果

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

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

我喜欢:

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

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

如果您有一个空的数据框架,这个解决方案确保没有只包含NaN的新行被添加。

指定dtype并不是必须的,但是如果没有指定dtype,更新的Pandas版本会产生DeprecationWarning。

从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(…),因为它目前不支持就地操作。

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

方法1(创建64个附加列,列名从1到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(创建64个附加列,列名从1到64)

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

为了补充DSM的答案,并在这个相关问题的基础上,我将这种方法分为两种情况:

添加单列:只需为新列分配空值,例如df['C'] = np.nan 添加多个列:我建议使用pandas的.reindex(columns=[…])方法将新列添加到数据帧的列索引中。这也适用于使用.reindex(rows=[…])添加多个新行。注意,更新版本的Pandas (v>0.20)允许您指定axis关键字,而不是显式地分配给列或行。

下面是一个添加多列的例子:

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

or

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

你也可以总是连接一个新的(空的)数据框架到现有的数据框架,但这对我来说不像python式的:)