#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть следующий фрейм данных (df).
df
city zip_code
0 city1 90287
1 city2 90288
2 city3 80023
3 city4 90210
4 city1 NaN
5 city4 NaN
6 city7 NaN
7 NaN 90210
8 NaN 80023
И я хочу добраться до этого состояния:
city zip_code
0 city1 90287
1 city2 90288
2 city3 80023
3 city4 90210
4 city1 90287
5 city4 90210
6 city7 NaN
7 city4 90210
8 city3 80023
Я хочу просмотреть оба столбца и заменить NaN соответствующим zip_code или city.
Вот что я сделал, но, как вы можете видеть, это не сработало полностью.
bool_series = pd.notnull(df['city'])
df_1=df[bool_series].dropna()
dict_df_1=df_1.to_dict(orient='records')
d={}
for i in range(len(dict_df_1)):
d[dict_df_1[i]['city']]=dict_df_1[i]['zip_code']
d1={}
for i in range(len(dict_df_1)):
d1[dict_df_1[i]['zip_code']]=dict_df_1[i]['city']
d.update(d1)
df['zip_mapped']=df['city'].map(d)
df['city_mapped']=df['zip_code'].map(d)
df
city zip_code zip_mapped city_mapped
0 city1 90287 90287 city1
1 city2 90288 90288 city2
2 city3 80023 80023 city3
3 city4 90210 90210 city4
4 city1 NaN 90287 NaN
5 city4 NaN 90210 NaN
6 city7 NaN NaN NaN
7 NaN 90210 NaN city4
8 NaN 80023 NaN city3
Если бы столбцы ‘zip_mapped’ и ‘city_maped’ были заполнены правильно, я бы просто заменил их оригинальными столбцами. Кто-нибудь может мне здесь помочь?
Комментарии:
1. Проверьте groupby.ffill
Ответ №1:
Давайте попробуем fillna
дважды на разных groupby:
df.zip_code = df.zip_code.fillna(df.zip_code.groupby(df.city).transform('first'))
df.city = df.city.fillna(df.city.groupby(df.zip_code).transform('first'))
Вывод:
city zip_code
0 city1 90287.0
1 city2 90288.0
2 city3 80023.0
3 city4 90210.0
4 city1 90287.0
5 city4 90210.0
6 city7 NaN
7 city4 90210.0
8 city3 80023.0