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

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

有没有更合理的方法?


当前回答

如果我理解正确,assignment应该填写:

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

其他回答

可以用df。插入(index_to_insert_at, column_header, init_value)在特定索引处插入新列。

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

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

你可以这样做

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

赋值会给你这个警告SettingWithCopyWarning:

一个值正试图从数据帧(DataFrame)中设置一个片的副本。试一试 使用.loc[row_indexer,col_indexer] = value代替

所以最好使用insert:

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

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

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