我相信有人也在这个帖子中报告过,填写数据框 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.
您正在更改行的类型,因此它正在修改副本.
保留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)
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |