有没有办法确定DataFrame是否是某个其他对象的片段来处理SettingWithCopyWarning的情况?
我终于能够在我正在进行计算的情况下重现SettingWithCopyWarning的示例:df [' new_col'] = value。
问题是df本身是来自grpBY.get_group()的切片返回。这很难评估,因为添加列是在计算中做了很多事情。
所以现在我明白df本身就是一个更大的数据帧的片段,我理解警告,但是调试它非常困难,因为我必须明白传递给我的服务函数的DF是一个片段。这是一个例子: 进口口 将pandas导入为pd 导入numpy为np
df = pd.DataFrame(np.random.randn(5,5), columns = ['col'+str(i) for i in range(5)])
df['grpID'] = df.apply(lambda x : df.columns[np.random.randint(5)], axis=1)
gBY = df.groupby('grpID')
def WorkOnDataFrameGroupSlice(gDF):
gDF['new_col'] = gDF.col1/gDF.col3
print gDF
for g in gBY.groups.keys():
gDF = gBY.get_group(g)
WorkOnDataFrameGroupSlice(gDF)
输出:
>>> WorkOnDataFrameGroupSlice(gBY)
__main__:4: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
col0 col1 col2 col3 col4 grpID new_col
1 0.30118 0.649366 -2.004724 -0.102476 -0.312678 col4 -6.336769
col0 col1 col2 col3 col4 grpID new_col
2 -0.344893 0.579363 -0.556483 -0.383786 -2.312829 col2 -1.5096
col0 col1 col2 col3 col4 grpID new_col
0 -0.916921 -0.329640 -0.959094 -0.667048 0.902691 col3 0.494177
3 1.936567 1.082553 -1.059511 -0.102200 0.902362 col3 -10.592540
4 0.808047 0.737737 0.380464 0.048980 0.674635 col3 15.061955