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

时间:2017-12-02 08:24:06

标签: python pandas

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

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

我使用它,即我选择类别'Buurt'并应用ffill(插入缺少的zipcodes)。但是具有另一个类别('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

我可以将NaN更改回点(。),但觉得必须有更好的方法。特别是因为'Buurt'的行实际上填充了一个点(。)而我将这些行改为NaN以首先填充fillna(method ='ffill')......

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

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

1 个答案:

答案 0 :(得分:1)

我认为您还需要分配到已过滤的列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

但是,如果要按ffill替换所有类别,请使用groupby

df['Zipcode'] = df.groupby('RegionType')['Zipcode'].ffill()

更一般:

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