使用groupby+transform('first')做fillna时出现SettingWithCopyWarning如何解决
问题原因
这个警告的本质是你当前操作的df是从另一个DataFrame中切片得到的视图/副本,pandas无法确认你修改这个df时是否需要同步修改原DataFrame,因此抛出告警。
解决方法
你可以任选以下任意一种方案处理:
方案1:创建df时明确指定为独立副本
如果你的df是之前通过过滤、切片其他DataFrame得到的(比如df = raw_df[raw_df['read_time'] >= '2019-01-01']这类写法),只需要在切片逻辑末尾加上.copy(),明确声明这是独立的副本即可:
# 原切片逻辑末尾加.copy() df = raw_df[你的过滤条件].copy() # 后续的填充代码不需要改动 df['lat'] = df.groupby('location_id')['lat'].transform('first') df['lng'] = df.groupby('location_id')['lng'].transform('first')
方案2:赋值时使用.loc明确指定列
如果你不想修改之前的df创建逻辑,就按照告警提示使用.loc写法完成赋值,即可消除告警:
df.loc[:, 'lat'] = df.groupby('location_id')['lat'].transform('first') df.loc[:, 'lng'] = df.groupby('location_id')['lng'].transform('first')
额外优化提示
你当前用的transform('first')是取分组内的第一个值,不会自动跳过空值,如果后续出现分组第一个值为nan的场景,可以调整为取分组第一个非空值,写法如下:
df.loc[:, 'lat'] = df.groupby('location_id')['lat'].transform(lambda x: x.dropna().iloc[0]) df.loc[:, 'lng'] = df.groupby('location_id')['lng'].transform(lambda x: x.dropna().iloc[0])
内容的提问来源于stack exchange,提问作者GeoBeez
相关产品推荐
相关产品推荐

