使用pandas更新列中的缺失值

时间:2016-10-28 08:34:57

标签: python pandas

我有一个数据框df,其中两列是'city'和'zip_code':

df = pd.DataFrame({'city': ['Cambridge','Washington','Miami','Cambridge','Miami',
'Washington'], 'zip_code': ['12345','67891','23457','','','']})

如上所示,某个特定城市包含其中一行中的邮政编码,但其他行中的同一城市缺少zip_code。我想根据其他行中该城市的zip_code值填充这些缺失值。基本上,只要缺少zip_code,就会检查其他行中该城市的zip_code,如果找到,则填写zip_code的值。如果找不到,则填写“NA”。

如何使用pandas完成此任务?

3 个答案:

答案 0 :(得分:1)

您可以使用str.len检查字符串长度,对于这些行,将主df过滤为具有有效zip_codes的那些,将索引设置为那些并在' city&#上调用map 39;将执行查找并填充这些值的列:

In [255]:
df.loc[df['zip_code'].str.len() == 0, 'zip_code'] = df['city'].map(df[df['zip_code'].str.len() == 5].set_index('city')['zip_code'])
df

Out[255]:
         city zip_code
0   Cambridge    12345
1  Washington    67891
2       Miami    23457
3   Cambridge    12345
4       Miami    23457
5  Washington    67891

如果您的真实数据有很多重复值,那么您首先需要另外调用drop_duplicates

df.loc[df['zip_code'].str.len() == 0, 'zip_code'] = df['city'].map(df[df['zip_code'].str.len() == 5].drop_duplicates(subset='city').set_index('city')['zip_code'])

您需要执行此操作的原因是,如果存在重复的索引条目,则会引发错误

答案 1 :(得分:1)

你可以去:

import numpy as np

df['zip_code'] = df.replace(r'', np.nan).groupby('city')['zip_code'].fillna(method='ffill').fillna(method='bfill')

>>> df
         city zip_code
0   Cambridge    12345
1  Washington    67891
2       Miami    23457
3   Cambridge    12345
4       Miami    23457
5  Washington    67891

答案 2 :(得分:0)

我的建议是首先创建一个从城市映射到邮政编码的dictonary。您可以从一个DataFrame创建此字典。

然后您使用该字典填写所有缺失的邮政编码值。