首页 > 解决方案 > Pandas 分配给链式 .loc 视图(不是副本)和 SettingWithCopyWarning

问题描述

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

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

目前它适用于此:

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

当有很多过滤器要填充时,这将变得相当复杂。是否可以“增量”地获取我处理的视图,然后将视图的设置值传播到原始 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)

标签: pythonpandas

解决方案


在我看来,不应该导致的更具可读性的解决方案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. 但是这种链接对于计算布尔级数的交集不是必需的。


推荐阅读