将 groupby 和 transform('first') 用于 fillna 时的 SettingWithCopyWarning

SettingWithCopyWarning when using groupby and transform('first') for fillna

我知道有很多类似的问题。我已经尝试使用它们一个多小时了,但是不能。

我有一个 table 如下所示:

read_time location_id lat lng
2019-02-01 1 43 -79.1
2019-02-01 2 43.1 -79.4
2019-02-01 3 43 -79.2
2020-03-01 2 nan nan

我想根据location_id填充空的纬度和经度。所以我这样做了:

df['lat'] = df.groupby('location_id')['lat'].transform('first')
df['lng'] = df.groupby('location_id')['lng'].transform('first')

并且如下:

read_time location_id lat lng
2019-02-01 1 43 -79.1
2019-02-01 2 43.1 -79.4
2019-02-01 3 43 -79.2
2020-03-01 2 43.1 -79.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

我不想像许多人建议的那样忽略警告。我想处理它。但我不知道怎么办!

尝试将 pd.DataFrameGroupBy.ffillbfill 结合使用:

>>> df = df.copy()
>>> df.loc[:, ['lat', 'lng']] = df.groupby('location_id').ffill().bfill()[['lat', 'lng']]
>>> df
    read_time  location_id   lat   lng
0  2019-02-01            1  43.0 -79.1
1  2019-02-01            2  43.1 -79.4
2  2019-02-02            2  43.1 -79.4
3  2019-02-01            3  43.0 -79.2
>>>