Pandas分配给链接的.loc视图(不是副本)和SettingWithCopyWarning

时间:2018-05-26 13:17:03

标签: python pandas

围绕.loc和SettingWithCopyWarning似乎存在很多混淆。就我而言,我无法从现有问题中找到解决这种情况的方法。

目前我有一个DF,我想用切片过滤,然后将值设置为传播到原始切片的这些切片。所以我不想要副本,我想要修改的视图。

目前它适用于此:

A0.loc[(A0['Pääkategoria'].isnull()) & (A0.Määrä < 0) & (A0.SaajaMaksaja.str.contains('|'.join(catfilter))), 'Pääkategoria'] = cat1

当有大量过滤器需要填满时,这将变得非常复杂。是否有可能逐步获得意见&#34;我工作,然后视图的设置值传播到原始DF A0

现在我有以下因素:SettingWithCopyWarning

A1 = A0.loc[(A0['Pääkategoria'].isnull() & (A0.Määrä < 0))]
A1.loc[A1.SaajaMaksaja.str.contains('|'.join(catfilter)), 'Pääkategoria'] = cat1

所以似乎A1只是一个副本,而不是一个切片。多次切片将允许我针对不同情况(例如,> 0)进行切片

2 个答案:

答案 0 :(得分:1)

在我看来,一个更易读的解决方案不应该导致SettingWithCopyWarning,而是将你的部分掩码计算为一个单独的步骤。

然后在&内使用pd.DataFrame.loc运算符:

mask = A0['Pääkategoria'].isnull() & (A0.Määrä < 0)

A0.loc[mask & A1.SaajaMaksaja.str.contains('|'.join(catfilter)), 'Pääkategoria'] = cat1

如您所见,链接loc索引器可能会引发SettingWithCopyWarning。但是这个链接不是计算布尔系列的交集所必需的。

答案 1 :(得分:0)

导入pandas后尝试这个(作为pd)

java.lang.NumberFormatException: For input string: "16606634614844517897"

试试