Mar*_*ker 7 python indexing dataframe pandas
我得到一个SettingWithCopyWarning以获取以下代码:
rain = DataFrame({'data':['1','2','3','4'],
                  'value':[1,-1,1,1]})
rain.value[rain.value < 0] = 0
虽然我没有收到警告
rain = DataFrame({'data':[1,2,3,4],
              'value':[1,-1,1,1]})
rain.value[rain.value < 0] = 0
唯一的区别是'data'列是第一个DataFrame中的字符串,第二个DataFrame中是数字.难道我做错了什么?是否有不同的(首选?)方式来做到这一点?该警告不应该始终如一地应用吗?
对于这个问题:
rain.value[rain.value < 0] = 0  # doesn't work
rain.loc[rain.value < 0] = 0  # works
为什么一个有效而另一个无效:
来自索引和选择数据的 pandas 文档- 部分评估顺序很重要
链式分配也可能出现在混合数据类型框架的设置中。
注意 这些设置规则适用于所有.loc/.iloc。
这是正确的访问方法:
In [345]: dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]})
In [346]: dfc.loc[0,'A'] = 11
In [347]: dfc
Out[347]: 
     A  B
0   11  1
1  bbb  2
2  ccc  3
这有时可能有效,但不能保证有效,因此应该避免:
In [348]: dfc = dfc.copy()
In [349]: dfc['A'][0] = 111
In [350]: dfc
Out[350]: 
     A  B
0  111  1
1  bbb  2
2  ccc  3
这根本不起作用,因此应该避免:
>>> pd.set_option('mode.chained_assignment','raise')
>>> dfc.loc[0]['A'] = 1111
Traceback (most recent call last)
     ...
SettingWithCopyException:
     A value is trying to be set on a copy of a slice from a DataFrame.
     Try using .loc[row_index,col_indexer] = value instead
警告 链接分配警告/异常旨在通知用户可能无效的分配。可能存在误报;无意中报告链式分配的情况。