基本上,如果我想更改原始df 中的数据,我总是必须使用.loc[]
。但请考虑以下
>>> import pandas as pd
>>> from scipy import random
>>> from numpy import arange
>>> T, N = 4, 5
>>> TIndex = arange(0, T)
>>> FIndex = arange(0, N)
>>> wp = pd.Panel(items=['A', 'w', 'l', 'a', 'x', 'X', 'd', 'profit'],
... major_axis=TIndex, minor_axis=FIndex)
>>> wp.loc['a', 0, 0] = 0
>>> df = wp.loc[0, 'a']
>>> df.loc[0, 'a'] = 'test'
>>> df.loc[0, 'a']
Out[379]: 'test'
>>> wp.loc['a', 0, 0]
Out[380]: 0
我做错了什么?
此外,没有抛出SettingWithCopyWarning
。当我在数据帧级别上犯这些错误时,我通常会得到这些。这非常令人恼火。
答案 0 :(得分:2)
我可以通过调用loc
中的标签来修改DataFrame和原始Panel。文档说loc
是strictly limited to labels,所以我不确定你发布的代码是否可以工作:将示例粘贴到IPython控制台(?)时我得到KeyError: 'the label [0] is not in the [items]'
而不是
df = wp.loc[0, 'a']
DO
df = wp.loc['a']
然后使用iloc
和整数索引进行修改:
In [3]: df
Out[3]:
0 1 2 3 4
0 0 NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
[4 rows x 5 columns]
In [4]: df.iloc[0, 0] = 'test'
In [5]: df
Out[5]:
0 1 2 3 4
0 test NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
[4 rows x 5 columns]
In [6]: wp.loc['a']
Out[6]:
0 1 2 3 4
0 test NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN
[4 rows x 5 columns]