如何一次将多个列添加到现有数据框中?

时间:2019-12-29 20:56:42

标签: python pandas dataframe

这是一个非常基本的python问题,与向现有数据框中添加列有关。为什么会这样

systemctl restart prometheus prometheus-node-exporter 返回以下错误:

  

ValueError:没有足够的值可解包(预期3,得到0)

但这很好用: df['Hour'],df['Month'],df['Day'] =""

这对我来说似乎很奇怪,因为在我的脑海中似乎我正在为每个单独的数据帧列分配3个空白条目的序列,而不是为每列分配一组空白。

我是python的新手,所以我肯定答案很明显,但是有人介意向我解释一下吗?

2 个答案:

答案 0 :(得分:2)

好吧,很难给出一个答案,而不仅仅是“那是因为这就是定义Python语法的方式”。正在执行的拆包使您可以执行以下操作:

In [63]: a, b = 3, 5

In [64]: a
Out[64]: 3

In [65]: b
Out[65]: 5

In [66]: l = [8, 10]

In [67]: c, d = l

In [69]: c
Out[69]: 8

In [70]: d
Out[70]: 10

也就是说,右侧的元素被解压缩为左侧适当数量的变量。知道了这一点,很明显,您的案例中右侧需要三个元素。

现在您可以 进行以下操作,这也许可以更紧密地映射到您的心理模型:

 df['Hour'] = df['Month'] = df['Day'] = ''

答案 1 :(得分:1)

您的左辅助操作符有多个目标。
这称为多重配给。 左侧运算符上的目标数量必须等于右侧运算符上的项目数量:

df['Hour'],df['Month'],df['Day'] = "" # not ok
df['Hour'],df['Month'],df['Day'] = "", "" , "" ok
A, B = 2, 3 # OK 

来自grammar

assignment_stmt ::=  (target_list "=")+ (starred_expression | yield_expression)
target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" [target_list] ")"
                     | "[" [target_list] "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target