Python 如何使用pandas来填充数据框中特定类别数据的缺失数据?

Python 如何使用pandas来填充数据框中特定类别数据的缺失数据?,python,pandas,Python,Pandas,如何使用pandas来填充数据框中特定类别数据的缺失数据 我在选择一个类别后使用了fillna(method='ffill'),但这会在其他类别上创建NaN值。有更好的办法吗 我使用它,即我选择类别“Buurt”并应用ffill(插入缺失的Zipcode)。但另一个类别(“Wijk”)的行将变为NaN df['Zipcode'] = df.loc[(df['RegionType'] == 'Buurt'), 'Zipcode'].fillna(method='ffill') df前后:

如何使用pandas来填充数据框中特定类别数据的缺失数据

我在选择一个类别后使用了fillna(method='ffill'),但这会在其他类别上创建NaN值。有更好的办法吗

我使用它,即我选择类别“Buurt”并应用ffill(插入缺失的Zipcode)。但另一个类别(“Wijk”)的行将变为NaN

df['Zipcode'] = df.loc[(df['RegionType'] == 'Buurt'), 'Zipcode'].fillna(method='ffill')
df前后:

           City                              Zipcode RegionType
Codering                                                   
BU06100305   Sliedrecht                     3362      Buurt
BU06100306   Sliedrecht                     3361      Buurt
BU06100307   Sliedrecht                     3361      Buurt
WK061004     Sliedrecht                        .       Wijk
BU06100401   Sliedrecht                      NaN      Buurt
BU06100402   Sliedrecht                      NaN      Buurt
BU06100403   Sliedrecht                     3364      Buurt
BU06100404   Sliedrecht                     3364      Buurt
BU06100405   Sliedrecht                     3364      Buurt
BU06100406   Sliedrecht                     3364      Buurt
           City                              Zipcode RegionType
Codering                                                   
BU06100305   Sliedrecht                     3362      Buurt
BU06100306   Sliedrecht                     3361      Buurt
BU06100307   Sliedrecht                     3361      Buurt
WK061004     Sliedrecht                      NaN       Wijk
BU06100401   Sliedrecht                     3361      Buurt
BU06100402   Sliedrecht                     3361      Buurt
BU06100403   Sliedrecht                     3364      Buurt
BU06100404   Sliedrecht                     3364      Buurt
BU06100405   Sliedrecht                     3364      Buurt
BU06100406   Sliedrecht                     3364      Buurt
我可以把南边改回一个点,但我觉得一定有更好的办法。特别是因为'Buurt'的行实际上是用点(.)填充的,我首先将它们改为NaN以进行fillna(method='ffill')

serieBuurtNoZipcode = (df['RegioType'] == 'Buurt') & (df['Zipcode'] == '.') 
df.loc[(serieBuurtNoZipcode), 'Zipcode'] = np.nan

我怎样才能以更聪明的方式做到这一点?非常感谢

我认为您也需要分配到筛选列
Zipcode

mask = (df['RegionType'] == 'Buurt')
df.loc[mask, 'Zipcode'] = df.loc[mask, 'Zipcode'].ffill()
print (df)
                  City Zipcode RegionType
Codering                                 
BU06100305  Sliedrecht    3362      Buurt
BU06100306  Sliedrecht    3361      Buurt
BU06100307  Sliedrecht    3361      Buurt
WK061004    Sliedrecht       .       Wijk
BU06100401  Sliedrecht    3361      Buurt
BU06100402  Sliedrecht    3361      Buurt
BU06100403  Sliedrecht    3364      Buurt
BU06100404  Sliedrecht    3364      Buurt
BU06100405  Sliedrecht    3364      Buurt
BU06100406  Sliedrecht    3364      Buurt

但如果要使用替换所有类别:

更一般的:

df['Zipcode'] = df.groupby('RegionType')['Zipcode'].apply(lambda x: x.ffill().bfill())

非常感谢,它起作用了!->我还必须在作业中戴上面具。groupby/ffill()也可以工作,这太神奇了!我以前尝试过ffill,但认为zipcode必须是一个整数才能使用它。如果没有groupby,我会得到“'float'对象没有'ffill'属性”。仅供参考,我尝试了:df['Zipcode']=df['Zipcode']。替换('.','0')。astype(int)和df.loc[(掩码),'Zipcode']=df.loc[(掩码),'Zipcode']。应用(lambda x:x.ffill().bfill())。它使zipcodes看起来像“3362.0”,并且不起作用。但是有了groupby,它就完美了,哇!只是想知道:为什么不是100%确定,但看起来int保存为字符串,因为如果所有数值都是浮点数(NaN是浮点数,所以它也将所有值转换为浮点数)。
df['Zipcode'] = df.groupby('RegionType')['Zipcode'].apply(lambda x: x.ffill().bfill())