如何向数据框添加空列?

2025-04-15 09:21:00
admin
原创
25
摘要:问题描述:向 Pandas DataFrame 对象添加空列最简单的方法是什么?我遇到的最好的方法是df['foo'] = df.apply(lambda _: '', axis=1) 有没有不那么不正当的方法?解决方案 1:如果我理解正确的话,作业应该填写:>>> import numpy...

问题描述:

向 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关键字,而不是显式地赋值给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 那样:)

解决方案 4:

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

df = df.reindex(columns = header_list)                

其中“header_list”是您想要出现的标题列表。

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

所以如果

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

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

解决方案 5:

以 开头v0.16.0DF.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')]

结果1

您也可以通过项目赋值来创建多个具有特定值的列。以下示例将列EFG初始化为 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')]
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用