Pandas一次初始化多个列

时间:2018-02-28 09:05:54

标签: python pandas

我有一个数据帧,我需要在其中创建两个(或更多)新列,这两个列都初始化为零。这就是我到达那里的目的 -

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 但是有没有更简单的方法(没有循环等)来实现这个目标?

2 个答案:

答案 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))