我有一个数据框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完成此任务?
答案 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创建此字典。
然后您使用该字典填写所有缺失的邮政编码值。