我相信有人也在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。
答案 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