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