我有一个数据帧,我需要在其中创建两个(或更多)新列,这两个列都初始化为零。这就是我到达那里的目的 -
import pandas as pd
df = pd.DataFrame({'value': {0: 0.6, 1: 0.5, 2: -0.7, 3: 0.6, 4: 0.7, 5: -0.7, 6: 0.9, 7: 0.5, 8: -0.6, 9: 0.5, 10: 0.6, 11: -0.5, 12: 0.5, 13: -0.6}, '_bare_nuclei': {0: 1, 1: 1, 2: 1, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0}, '_bland_chromatin': {0: 0, 1: 0, 2: 0, 3: 1, 4: 1, 5: 1, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0}, '_cell_shape_uniformity': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 1, 7: 1, 8: 1, 9: 1, 10: 0, 11: 0, 12: 0, 13: 0}, '_cell_size_uniformity': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 1, 11: 1, 12: 1, 13: 0}, '_clump_thickness': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 1}})
new_cols = ['_normal_nucleoli', '_epithelial_cell_size', '_mitoses']
df.loc[:,new_cols] = 0
我认为这会起作用并给我想要的结果。但我收到以下错误。
KeyError: "['_normal_nucleoli' '_epithelial_cell_size' '_mitoses'] not in index"
它表示这些密钥不在index
中。我不明白这一部分。为什么错误说index
?我在这里访问columns
。
但是,更重要的是,如何在不使用循环的情况下创建多个列。我知道我可以使用 -
创建新列for each_new_col in new_cols:
df.loc[:,each_new_col] = 0
或使用df.assign
但是有没有更简单的方法(没有循环等)来实现这个目标?
答案 0 :(得分:6)
你可以很容易地在这里使用assign
(没有循环):
df = df.assign(**dict.fromkeys(new_cols, 0))
其中,
print(dict.fromkeys(new_cols, 0))
{'_epithelial_cell_size': 0, '_mitoses': 0, '_normal_nucleoli': 0}
您需要在将字典传递给assign
时解压缩字典,因为该函数仅接受关键字参数。
答案 1 :(得分:3)
如果新列的顺序很重要,请使用join
:
df = df.join(pd.DataFrame(0, columns=new_cols, index=df.index))