如何在pandas DataFrame
对象中添加一个空列是最简单的方法?我发现最好的方法是这样的:
df['foo'] = df.apply(lambda _: '', axis=1)
有没有更不那么歪曲的方法?
如何在pandas DataFrame
对象中添加一个空列是最简单的方法?我发现最好的方法是这样的:
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
df
是空的,你可能需要使用 df['new'] = pd.Series()
(请参见下面我的答案)。 - Carstendf[["newcol1","newcol2","newcol3"]] = None
。 - Skippy le Grand Gouroudf.loc[:, ["newcol1","newcol2","newcol3"]] = np.nan
- think补充DSM答案并且结合这个相关问题,我会把方法分成两种情况:
添加一列:只需要给新的列分配空值,例如df['C'] = np.nan
添加多列:我建议使用pandas中的.reindex(columns=[...])
方法将新的列加入到数据框的列索引中。对于添加多行也可以使用.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 风格一样 :)
version >= 0.20.0
,则删除原始数据框并将新列添加为行。如果 version < 0.20.0
,则在 Pandas 版本 0.24.1
上可以正常工作。 - Laloversion = 0.25
中Pandas需要, axis=1
。 我尝试修改您的答案以包括更新的版本,但被 @kenlukas 和 @il_raffa 拒绝了。我希望每个像我一样苦苦挣扎想要理解为什么您的回答对他们不起作用的人,至少能看到这条评论。 - smgeneralist我喜欢:
df['new'] = pd.Series(dtype='int')
# or use other dtypes like 'float', 'object', ...
如果您有一个空的数据框,此解决方案可以确保不会添加只包含NaN
的新行。
指定dtype
并非必须,但是较新的Pandas版本会产生DeprecationWarning
,如果未指定,则需要注意。
df
,则可以添加 index = df.index
。 - Wtower甚至更简单的解决方案是:
df = df.reindex(columns = header_list)
“header_list”是您想显示的标题列表。
在该列表中包含但数据框中不存在的任何标题将显示为空白单元格。
因此,如果
header_list = ['a','b','c', 'd']
那么,c和d将作为空单元格的列添加。
从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(...)
,因为它当前不支持inplace
操作。
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=['col1','col2','col3','col4']
for i in a:
df[i]=np.nan
在特定的索引位置,可以使用df.insert(index_to_insert_at, column_header, init_value)
插入新的列。
cost_tbl.insert(1, "col_name", "")
上述语句会在第一列后插入一个空列。
@emunsing的回答很酷,可以添加多列,但我在Python 2.7中无法使其工作。相反,我发现以下方法可行:
mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['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
? - filmor