pandas 使用模式值填充列中的空值的循环正在中断,仍然没有有效的解决方案

m4pnthwp  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(119)

以下是我的数据框示例:

import pandas as pd
import numpy as np

d=['SKODASUPERB','SKODASUPERB',\
   'SKODASUPERB','MERCEDES-BENZE CLASS','ASTON MARTINVIRAGE'\
       ,'ASTON MARTINVIRAGE','ASTON MARTINVIRAGE','TOYOTAHIACE',\
           'TOYOTAAVENSIS','TOYOTAAVENSIS','TOYOTAAVENSIS','TOYOTAAVENSIS',\
               'FERRARI360','FERRARILAFERRARI']
x=['SUV','SUV','nan','nan','SPORTS','SPORTS','SPORTS',\
   'nan','SEDAN','SEDAN','SEDAN','SEDAN','SPORT','SPORT'] 


df=pd.DataFrame({'make_model':d,'body':x})
df.body=df.body.replace('nan',np.NaN)
df.head()

Out[24]: 
             make_model    body
0           SKODASUPERB     SUV
1           SKODASUPERB     SUV
2           SKODASUPERB     NaN
3  MERCEDES-BENZE CLASS     NaN
4    ASTON MARTINVIRAGE  SPORTS

“body”列中有一些空值

df.body.isnull().sum()
Out[25]: 3

因此,我尝试通过使用特定make_model的body类型模式来填充body列中的空值。例如,SKODASUPERB的2个观察结果的body为“SUV”,1个观察结果的body为空。因此,SKODASUPERB的body模式将为“SUV”,我希望第三个观察结果也填充“SUV”。为此,我使用以下代码

make_model_list=df.make_model.unique().tolist()

for x in make_model_list:
    df.loc[(df['make_model']==x)&(df['body'].isnull()),'body']=\
        df.loc[(df['make_model']==x)&(df['body'].isnull()),'body']\
            .fillna(df.loc[df['make_model']==x,'body'].mode())

不幸的是,由于某些观察没有模式值,循环中断

df.body.isnull().sum()
Out[30]: 3

我怎么能强迫循环运行,即使没有模式'身体'的值为一个特定的make_model。我知道我可以使用继续命令,但我不知道如何写它。

zrfyljdw

zrfyljdw1#

假设make_model和body是不同的值:

donor = df.dropna().groupby(by=['make_model']).agg(pd.Series.mode).reset_index()
df = df.merge(donor, how='left', on=['make_model'])
df['body_x'].fillna(df.body_y, inplace=True)
df.drop(columns=['body_y'], inplace=True)
df.columns = ['make_model', 'body']
df
    make_model  body
0   SKODASUPERB SUV
1   SKODASUPERB SUV
2   SKODASUPERB SUV
3   MERCEDES-BENZE CLASS    NaN
4   ASTON MARTINVIRAGE  SPORTS
5   ASTON MARTINVIRAGE  SPORTS
6   ASTON MARTINVIRAGE  SPORTS
7   TOYOTAHIACE NaN
8   TOYOTAAVENSIS   SEDAN
9   TOYOTAAVENSIS   SEDAN
10  TOYOTAAVENSIS   SEDAN
11  TOYOTAAVENSIS   SEDAN
12  FERRARI360  SPORT
13  FERRARILAFERRARI    SPORT

相关问题