将 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.ffill
与 bfill
结合使用:
>>> 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
>>>
我知道有很多类似的问题。我已经尝试使用它们一个多小时了,但是不能。
我有一个 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.ffill
与 bfill
结合使用:
>>> 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
>>>