Python 如何将空列添加到数据帧?
向数据框添加空列的最简单方法是什么?我偶然发现的最好的东西是Python 如何将空列添加到数据帧?,python,pandas,Python,Pandas,向数据框添加空列的最简单方法是什么?我偶然发现的最好的东西是 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
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(v>0.20)允许您指定.reindex(rows=[…])
关键字,而不是显式分配给轴
或列
行
mydf = mydf.reindex(columns = mydf.columns.tolist() + ['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
或
您也可以始终将新的(空)数据帧连接到现有的数据帧,但这对我来说并不像pythonic:)从
v0.16.0开始,可以用于将新列(单个/多个)分配给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
操作。@emunsing对于添加多个列来说非常酷,但我无法在python 2.7中使用它。相反,我发现这是可行的:
mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
更简单的解决方案是:
df = df.reindex(columns = header_list)
其中“header_list”是要显示的标题列表
数据框中未找到的列表中包含的任何标题将添加以下空白单元格
所以如果
header_list = ['a','b','c', 'd']
然后,如果要从列表中添加列名,则c和d将添加为带有空白单元格的列
df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
df[i]=np.nan
我喜欢:
df['new']=pd.Series(dtype='your\u required\u dtype')
如果数据框为空,此解决方案确保不添加仅包含NaN
的新行
严格来说,指定dtype
不是必需的,但是较新的Pandas版本会在未指定的情况下产生DeprecationWarning
。下面的代码解决了“如何将n个空列添加到现有数据帧”的问题。为了将类似问题的解决方案放在一个地方,我在这里添加了它
方法1(使用1-64中的列名创建64个附加列)
方法2(使用1-64中的列名创建64个附加列)
你能行
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.insert(index\u to\u insert\u at,column\u header,init\u value)
在特定索引处插入新列
cost_tbl.insert(1, "col_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
我寻找这种解决方案的原因只是在多个DFs之间添加空格,这些DFs使用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到excel。
Jupyter空白列看起来与excel中的相同,但没有xlsx格式。
不确定第二个Lambda调用为何不起作用。这也适用于多个列:
mydf = mydf.reindex(columns = mydf.columns.tolist() + ['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
?你能解释一下为什么你想要创建一个空列,而不是仅仅组装一个值列表并直接在末尾赋值吗?更准确地说,这些列将添加NaN。C的数据类型是什么?我试图通过循环字符串列表来添加。例如,version>=0.20.0
删除数据框并将新列作为行添加。version<0.20.0
的示例在Pandas版本0.24.1
@emunsing上运行良好在搜索此问题的答案时,我最终发现您的答案很有用。然而,一开始它对我不起作用,因为熊猫需要,axis=1
在版本=0.25
中。我试图修改您的答案以包含更新版本,但被@kenlukas和@il_raffa拒绝。我希望每个努力理解你的回答为什么对他们不起作用的人——就像我一样——至少会遇到这样的评论。@Griff-我现在更新了我的答案,以便更准确、更明确地说明版本兼容性问题。谢谢你强调这一点。这个答案刚刚为我创建了新行。@logicbloke你能提供一个发生这种情况的例子吗?如果df
是空的,你可能想使用df['new']=pd.Series()
(见下面我的答案)如何添加多个空列?@M.Mariscaldf[[“newcol1”、“newcol2”、“newcol3”]=无
。好的,所以。。。确保在给出答案时,请给出
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