使用iterrows时的持久性问题()

Ame*_*ina 1 python pandas

我相信有人也在这个帖子中报告过,填写数据框 iterrows()会导致持久性问题.例如,简单的事情:

my_dataframe = pd.DataFrame(np.NaN, index = xrange(5),columns=['foo',  'bar'])

for ix, row in my_dataframe.iterrows():
  row['foo'] = 'Hello'
Run Code Online (Sandbox Code Playgroud)

导致数据帧没有变化:

> my_dataframe
    foo  bar
0   NaN  NaN
1   NaN  NaN
2   NaN  NaN
3   NaN  NaN
4   NaN  NaN
Run Code Online (Sandbox Code Playgroud)

我没有任何警告,没有例外,等等.这是打算吗?这是一个错误吗?意?究竟发生了什么?

以上是最新稳定版的Pandas,0.13.1.

And*_*den 5

您正在更改行的类型,因此它正在修改副本.

保留dtype的东西在这种情况下会起作用:

In [11]: for ix, row in my_dataframe.iterrows():
   ....:       row['foo'] = 1
Run Code Online (Sandbox Code Playgroud)

这种行为无法保证,使用loc进行分配或直接分配列要好得多:

In [12]: row['foo'] = 'Hello'  # works

In [13]: row.loc[:, 'foo'] = 'Hello'  # works
Run Code Online (Sandbox Code Playgroud)

请参阅在文档中返回视图与副本.

我应该补充一点,你可以通过分配到原始帧(使用loc/ix)来做到这一点,但是你可以(而且应该)通过向量化你的解决方案而不是迭代每一行来避免这种情况:

for ix, row in my_dataframe.iterrows():
      my_dataframe.ix[ix, 'foo'] = 'Hello'  # works
Run Code Online (Sandbox Code Playgroud)