如何向数据框添加空列?
- 2025-04-15 09:21:00
- admin 原创
- 24
问题描述:
向 Pandas DataFrame 对象添加空列最简单的方法是什么?我遇到的最好的方法是
df['foo'] = df.apply(lambda _: '', axis=1)
有没有不那么不正当的方法?
解决方案 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
解决方案 2:
我喜欢:
df['new'] = pd.Series(dtype='int')
# or use other dtypes like 'float', 'object', ...
如果您有一个空的数据框,此解决方案可确保不NaN
添加仅包含的新行。
指定dtype
并不是严格必要的,但是DeprecationWarning
如果没有指定,较新的 Pandas 版本会产生。
解决方案 3:
为了补充 DSM 的答案并在此相关问题的基础上,我将方法分为两种情况:
添加单个列:只需为新列分配空值,例如
df['C'] = np.nan
添加多列:我建议使用
.reindex(columns=[...])
Pandas 的方法将新列添加到 DataFrame 的列索引中。这也适用于使用 添加多个新行.reindex(rows=[...])
。请注意,较新版本的 Pandas (v>0.20) 允许您指定axis
关键字,而不是显式地赋值给columns
或rows
。
以下是添加多列的示例:
mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])
或者
mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1) # version > 0.20.0
您还可以随时将新的(空)数据框连接到现有数据框,但对我来说这并不像 Python 那样:)
解决方案 4:
一个更简单的解决方案是:
df = df.reindex(columns = header_list)
其中“header_list”是您想要出现的标题列表。
列表中包含的任何尚未在数据框中找到的标题都将添加到下面的空白单元格中。
所以如果
header_list = ['a','b','c', 'd']
然后 c 和 d 将作为带有空白单元格的列添加
解决方案 5:
以 开头v0.16.0
,DF.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
操作。
解决方案 6:
df["C"] = ""
df["D"] = np.nan
分配将向您发出此警告SettingWithCopyWarning:
尝试在 DataFrame 切片的副本上设置值。请尝试使用 .loc[row_indexer,col_indexer] = value
所以最好使用插入:
df.insert(index, column-name, column-value)
如果这个答案对你有帮助,别忘了点赞
解决方案 7:
如果你想从列表中添加列名
df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
df[i]=np.nan
解决方案 8:
@emunsing 的答案对于添加多列来说非常酷,但我无法在 Python 2.7 中使用它。相反,我发现这个有效:
mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
解决方案 9:
可以用来df.insert(index_to_insert_at, column_header, init_value)
在特定索引处插入新列。
cost_tbl.insert(1, "col_name", "")
上述语句将在第一列后插入一个空列。
解决方案 10:
这也适用于多列:
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()
然后对列等进行任何您想做的事情。
解决方案 11:
你可以做
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
解决方案 12:
如果您有一个想要为空的列列表,则可以使用assign
,然后使用理解字典,然后使用字典解包。
>>> 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 = df.assign(**{
**{col:np.nan for col in my_empy_columns_name},
**{col:"" for col in empty_string_cols_name}
}
)
解决方案 13:
下面的代码解决了“如何向现有的 DataFrame 添加 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,'')
解决方案 14:
抱歉,一开始我没能很好地解释我的答案。还有另一种方法可以向现有数据框添加新列。第一步,创建一个新的空数据框(包含你数据框中的所有列,以及你想添加的一列或几列),命名为 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
解决方案 15:
我寻找这种解决方案的原因只是在使用 pd.concat 函数按列连接的多个 DF 之间添加空格,然后使用 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 调用没有成功。
解决方案 16:
您可以通过直接赋值列表来添加多个空列。以下示例列C
包含一列空字符串和D
一列 NaN。
df = pd.DataFrame({"A": [1, 2, 3], "B": [2, 3, 4]})
df[['C', 'D']] = ['', float('nan')]
您也可以通过项目赋值来创建多个具有特定值的列。以下示例将列E
、F
和G
初始化为 NaN 值。
df[["E","F","G"]] = float('nan')
# this can be done using `assign` as well
df = df.assign(**dict.fromkeys(['E', 'F', 'G'], float('nan')))
如果在创建新列时收到 SettingWithCopyWarning,则表明您的数据框是使用过滤操作从另一个数据框创建的,因此只需打开写时复制模式(计划成为 pandas 3.0 的默认行为)即可消除该警告(有关更多信息,请参阅此答案)。
pd.set_option('mode.copy_on_write', True) # turn on CoW
df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df1 = df.query("A<3")
df1[['C', 'D']] = ['', float('nan')]
扫码咨询,免费领取项目管理大礼包!