向pandas DataFrame对象添加空列的最简单方法是什么?我碰到的最好的是
df['foo'] = df.apply(lambda _: '', axis=1)
有没有更合理的方法?
向pandas DataFrame对象添加空列的最简单方法是什么?我碰到的最好的是
df['foo'] = df.apply(lambda _: '', axis=1)
有没有更合理的方法?
当前回答
df["C"] = ""
df["D"] = np.nan
赋值会给你这个警告SettingWithCopyWarning:
一个值正试图从数据帧(DataFrame)中设置一个片的副本。试一试 使用.loc[row_indexer,col_indexer] = value代替
所以最好使用insert:
df.insert(index, column-name, column-value)
其他回答
我寻找这样一个解决方案的原因只是在多个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到excel。 Jupyter空白列看起来和excel一样,虽然没有xlsx格式。 不知道为什么第二个Lambda调用没有工作。
为了补充DSM的答案,并在这个相关问题的基础上,我将这种方法分为两种情况:
添加单列:只需为新列分配空值,例如df['C'] = np.nan 添加多个列:我建议使用pandas的.reindex(columns=[…])方法将新列添加到数据帧的列索引中。这也适用于使用.reindex(rows=[…])添加多个新行。注意,更新版本的Pandas (v>0.20)允许您指定axis关键字,而不是显式地分配给列或行。
下面是一个添加多列的例子:
mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])
or
mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1) # version > 0.20.0
你也可以总是连接一个新的(空的)数据框架到现有的数据框架,但这对我来说不像python式的:)
如果你有一个列列表,你想要为空,你可以使用赋值,然后理解字典,然后字典解包。
>>> 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.assign(**{
**{col:np.nan for col in my_empy_columns_name},
**{col:"" for col in empty_string_cols_name}
}
)
如果我理解正确,assignment应该填写:
>>> 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['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