潜在错误:使用i设置未定义列的值

2024-10-17 08:33:29 发布

您现在位置:Python中文网/ 问答频道 /正文

如果你这样做了

>>> df = pd.DataFrame(np.arange(0,9), columns=['count'])
>>> df.iloc[0:5]['group'] = 'a'
>>> df
Out[346]: 
   count
0      0
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8

不会设置任何值。但是,如果你第一次

>>> df['group'] = 'b'
>>> df.iloc[0:5]['group'] = 'a'
>>> df
    Out[353]: 
   count group
0      0     a
1      1     a
2      2     a
3      3     a
4      4     a
5      5     b
6      6     b
7      7     b
8      8     b

对我来说,这是意想不到的行为。无论我是否使用iloc子选择一些列,我都希望这样做是可行的。但是,如果这不起作用,至少我预期会出现错误/警告。唯一一次我不希望设置任何值,也不希望出现任何警告的情况是,当我使用索引设置一些值时,索引实际上不存在于左侧。你知道吗

我来了

>>> pd.__version__
Out[355]: '0.14.0rc1-51-gccd593f'

Tags: columns警告dataframedfversioncount错误np
1条回答
网友
1楼 · 发布于 2024-10-17 08:33:29

不,这不是窃听器:当你打电话的时候

df.iloc[0:5]['group']

“引擎盖下”实际上是两个电话:

m = df.iloc[0:5]
m['group'] = 'a'

而且,如您所见,df根本没有改变。但是,通过这样做:

df['group'] = 'b'

实际上您更改了df,如果此时print df,您将得到另一列b

   count group
0      0     b
1      1     b
2      2     b
3      3     b
4      4     b
5      5     b
6      6     b
7      7     b
8      8     b

所以当你继续做的时候:

df.iloc[0:5]['group'] = 'a'

您正在更改刚刚添加到df的列。你知道吗

正如杰夫在上面的评论中提到的,根据docs

Sometimes when you slice an array you will simply get a view back, which means you can set it no problem. However, even a single dtyped array can generate a copy if it is sliced in a particular way

进一步:


enter image description here

这意味着熊猫的设计者允许不同的行为(返回一个视图和返回一个副本),可能是为了达到性能,为了不陷入这种意想不到的行为,他们在文档中警告你,并提供了“正确”的使用方式,即df.loc[0:5,'group'] = 'a'

总之,这不是一个错误-它是“设计的”

相关问题 更多 >