pandas数据帧条目有时是可修改的,有时是n

2024-05-23 19:08:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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)我是不是做错了什么事,让熊猫表现得像这样毫无直觉?如果是这样的话,用什么方法从另一列构造一列,这样就不会发生这种情况了?在

任何好的回答或建议都将不胜感激。谢谢!在


Tags: 方法inhellodataframepandasdfforindex
2条回答

首先,您应该在迭代数据帧时从不尝试修改它。在

要构建新列,只需执行以下操作:

df['C'] = df['A']

或者专门用于获取每个字符串的长度(请参见docs):

^{pr2}$

产生不同输出的原因是,根据不同的环境(如果数据类型是否相同)获得原始数据的视图或副本。
所有的数据和列的修改都会反映在原始视图中。但是在添加了列D之后,这些列有不同的数据类型,并且在迭代时会得到一个副本。由于这个原因,在上一个例子中,调整没有反映在原始数据帧中(另请参见issue)。在

代码生成不同答案的原因与itterrows提供数据的视图和副本有关。如果指定给视图,它将修改原始数据,而指定给副本不会产生任何效果。在

据我所知,answeritterrows将只为单个数据类型对象生成一个视图,这就是当所有列都是字符串时赋值有效,但一旦添加了一个整型列,就失败了。在

关于如何基于其他列创建新列—如果您绝对需要迭代,那么可以使用loc进行赋值,就像在一个示例中所做的那样。但是,您应该始终寻找一个向量化的解决方案,然后查看apply,然后再考虑迭代。有关更多背景信息,请参阅answer。在

相关问题 更多 >