我是python和pandas的新手,我不明白为什么有时我可以复制或操作dataframe列,有时却不能
A B C
0 hello hola bonjour
1 goodbye adios au revoir
我的第一个修改是使用for循环逐行覆盖列'C'(是的,可能有更好的方法来实现这一点-这不是重点),结果正如我预期的那样:
^{pr2}$我可以使用下面的for循环添加一个新列,同样,我得到了我期望的结果:
for index,row in df.iterrows():
df.ix[index,'D'] = len(row['C'])
A B C D
0 hello hola hello 5
1 goodbye adios goodbye 7
现在,我尝试了与第一次修改几乎完全相同的操作(用for循环逐行覆盖列“B”),但这次它不起作用。数据帧这次没有改变。在
for index,row in df.iterrows():
row['B'] = row['A']
A B C D
0 hello hola hello 5
1 goodbye adios goodbye 7
我想知道两件事:
1)为什么同一个代码有时会覆盖一个列,而有时不会覆盖?在
2)我是不是做错了什么事,让熊猫表现得像这样毫无直觉?如果是这样的话,用什么方法从另一列构造一列,这样就不会发生这种情况了?在
任何好的回答或建议都将不胜感激。谢谢!在
首先,您应该在迭代数据帧时从不尝试修改它。在
要构建新列,只需执行以下操作:
或者专门用于获取每个字符串的长度(请参见docs):
^{pr2}$产生不同输出的原因是,根据不同的环境(如果数据类型是否相同)获得原始数据的视图或副本。
所有的数据和列的修改都会反映在原始视图中。但是在添加了列
D
之后,这些列有不同的数据类型,并且在迭代时会得到一个副本。由于这个原因,在上一个例子中,调整没有反映在原始数据帧中(另请参见issue)。在代码生成不同答案的原因与
itterrows
提供数据的视图和副本有关。如果指定给视图,它将修改原始数据,而指定给副本不会产生任何效果。在据我所知,answer,
itterrows
将只为单个数据类型对象生成一个视图,这就是当所有列都是字符串时赋值有效,但一旦添加了一个整型列,就失败了。在关于如何基于其他列创建新列—如果您绝对需要迭代,那么可以使用
loc
进行赋值,就像在一个示例中所做的那样。但是,您应该始终寻找一个向量化的解决方案,然后查看apply
,然后再考虑迭代。有关更多背景信息,请参阅answer。在相关问题 更多 >
编程相关推荐