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

时间:2014-03-10 21:28:56

标签: python pandas

我相信有人也在this thread中报告过,使用iterrows()填充数据框可能会导致持久性问题。例如。简单的事情:

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

for ix, row in my_dataframe.iterrows():
  row['foo'] = 'Hello'

导致数据框没有变化:

> my_dataframe
    foo  bar
0   NaN  NaN
1   NaN  NaN
2   NaN  NaN
3   NaN  NaN
4   NaN  NaN

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

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

1 个答案:

答案 0 :(得分:5)

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

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

In [11]: for ix, row in my_dataframe.iterrows():
   ....:       row['foo'] = 1

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

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

In [13]: row.loc[:, 'foo'] = 'Hello'  # works

请参阅returning a view vs a copy in the docs

我应该添加你可以通过分配到原始帧(使用loc / ix)来做到这一点,但是你可以(而且应该)通常通过矢量化你的解决方案而不是迭代每个行:

for ix, row in my_dataframe.iterrows():
      my_dataframe.ix[ix, 'foo'] = 'Hello'  # works