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
为了添加到 DSM 的答案并在此相关问题的基础上构建,我将方法分为两种情况:
添加单列:只需为新列分配空值,例如df['C'] = np.nan
添加多列:我建议使用.reindex(columns=[...])
pandas 的方法将新列添加到数据框的列索引中。这也适用于添加多个新行.reindex(rows=[...])
。请注意,较新版本的 Pandas (v>0.20) 允许您指定axis
关键字而不是显式分配给columns
or rows
。
这是添加多个列的示例:
mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])
或者
mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1) # version > 0.20.0
您也可以始终将新的(空)数据框连接到现有的数据框,但这对我来说并不像 pythonic :)
一个更简单的解决方案是:
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
添加包含 only 的新行。
指定dtype
不是绝对必要的,但是DeprecationWarning
如果未指定,较新的 Pandas 版本会产生一个。
从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
操作。
如果要从列表中添加列名
df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
df[i]=np.nan
@emunsing 的答案对于添加多列真的很酷,但我无法让它在 python 2.7 中为我工作。相反,我发现这很有效:
mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
可以使用df.insert(index_to_insert_at, column_header, init_value)
在特定索引处插入新列。
cost_tbl.insert(1, "col_name", "")
上面的语句将在第一列之后插入一个空列。
这也适用于多列:
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 个空列”的问题。为了将类似问题的解决方案保存在一个地方,我在这里添加它。
方法 1(使用 1-64 的列名创建 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(使用 1-64 的列名创建 64 个附加列)
df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')
你可以做
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_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
我寻找这种解决方案的原因只是在多个 DF 之间添加空格,这些 DF 已使用 pd.concat 函数按列连接,然后使用 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 来表现出色。Jupyter 空白列看起来与 excel 中的相同,但没有 xlsx 格式。不知道为什么第二个 Lambda 调用不起作用。