Замените NaN значениями в строке из предыдущих совпадающих значений в столбце

#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