如何使用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
我怎样才能以更聪明的方式做到这一点?非常感谢提前!
答案 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())