如何将多个空列添加到DataFrame
列表中的?
我可以:
df["B"] = None
df["C"] = None
df["D"] = None
但是我不能:
df[["B", "C", "D"]] = None
KeyError: "['B' 'C' 'D'] not in index"
如何将多个空列添加到DataFrame
列表中的?
我可以:
df["B"] = None
df["C"] = None
df["D"] = None
但是我不能:
df[["B", "C", "D"]] = None
KeyError: "['B' 'C' 'D'] not in index"
df[['B','C','D']] = None, None, None
或[None, None, None]
或pd.DataFrame([None, None, None])
Answers:
我concat
使用的是DataFrame:
In [23]:
df = pd.DataFrame(columns=['A'])
df
Out[23]:
Empty DataFrame
Columns: [A]
Index: []
In [24]:
pd.concat([df,pd.DataFrame(columns=list('BCD'))])
Out[24]:
Empty DataFrame
Columns: [A, B, C, D]
Index: []
因此,通过传递包含原始df的列表以及包含您要添加的列的新列表,这将返回包含其他列的新df。
警告:请参阅其他答案和/或评论讨论中有关性能的讨论。reindex
在性能至关重要的情况下可能更可取。
pd.concat([df,pd.DataFrame(columns=list('BCD'))])
–它没有任何作用。可能是因为我使用了df = pd.read_csv
而不是df = pd.DataFrame
?
df=pd.concat([df,pd.DataFrame(columns=list('BCD'))])
df.ix[:, col_list]
或者仅通过选择它们并将它们分配回原始df即可:df = df[col_list]
TypeError: data type not understood
。
0.19.1
您需要发布可以运行的完整代码
您可以df.reindex
用来添加新列:
In [18]: df = pd.DataFrame(np.random.randint(10, size=(5,1)), columns=['A'])
In [19]: df
Out[19]:
A
0 4
1 7
2 0
3 7
4 6
In [20]: df.reindex(columns=list('ABCD'))
Out[20]:
A B C D
0 4 NaN NaN NaN
1 7 NaN NaN NaN
2 0 NaN NaN NaN
3 7 NaN NaN NaN
4 6 NaN NaN NaN
reindex
将返回一个新的DataFrame,其列按列出的顺序显示:
In [31]: df.reindex(columns=list('DCBA'))
Out[31]:
D C B A
0 NaN NaN NaN 4
1 NaN NaN NaN 7
2 NaN NaN NaN 0
3 NaN NaN NaN 7
4 NaN NaN NaN 6
该reindex
方法也作为fill_value
参数:
In [22]: df.reindex(columns=list('ABCD'), fill_value=0)
Out[22]:
A B C D
0 4 0 0 0
1 7 0 0 0
2 0 0 0 0
3 7 0 0 0
4 6 0 0 0
inplace=True
。它没有做大多数人认为的那样。在后台,总是创建一个全新的DataFrame,然后将来自新DataFrame的数据复制到原始DataFrame中。那不会节省任何内存。inplace=True
没有实质性的橱窗装饰也是如此,而且,其名称具有误导性。我尚未检查代码,但我预计df = df.reindex(...)
至少需要2倍的内存df
,并且在reindex
用于扩展行数时当然会更多。
如果您不想重写旧列的名称,则可以使用reindex:
df.reindex(columns=[*df.columns.tolist(), 'new_column1', 'new_column2'], fill_value=0)
完整示例:
In [1]: df = pd.DataFrame(np.random.randint(10, size=(3,1)), columns=['A'])
In [1]: df
Out[1]:
A
0 4
1 7
2 0
In [2]: df.reindex(columns=[*df.columns.tolist(), 'col1', 'col2'], fill_value=0)
Out[2]:
A col1 col2
0 1 0 0
1 2 0 0
并且,如果您已经有了包含列名称的列表,请执行以下操作:
In [3]: my_cols_list=['col1','col2']
In [4]: df.reindex(columns=[*df.columns.tolist(), *my_cols_list], fill_value=0)
Out[4]:
A col1 col2
0 1 0 0
1 2 0 0
*
做的reindex
输入吗?
替代解决方案摘要:
columns_add = ['a', 'b', 'c']
for循环:
for newcol in columns_add:
df[newcol]= None
dict方法:
df.assign(**dict([(_,None) for _ in columns_add]))
元组分配:
df['a'], df['b'], df['c'] = None, None, None
df.assign(**dict.fromkeys(columns_add, None))
应该也可以工作
我会用
df["B"], df["C"], df["D"] = None, None, None
要么
df["B"], df["C"], df["D"] = ["None" for a in range(3)]
None
不同于0,但是一些答案假设它是等效的。同样,分配None
将给出对象的dtype,但是分配0将给出int的dtype。