2016-10-28 27 views
1

我有一個數據幀DF具有兩個列是「城市」和「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」。

如何使用熊貓來完成此任務?

回答

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 
+0

TypeError:不能使用帶有空鍵的標籤索引 – ComplexData

+0

你應該沒有更新的問題:) –

+0

這個答案比較好而不是EdChum的,因爲在你有不同的zip_codes的城市的情況下,它不會給出錯誤。它只是選擇第一個。 –

0

我的建議是首先創建一個從城市到郵政編碼的地圖。您可以從一個DataFrame創建此字典。

然後您使用該字典填寫所有缺少的郵政編碼值。

1

您可以檢查使用str.len字符串的長度和這些行,篩選主要DF那些具有有效zip_codes,設置索引這些,並呼籲將執行查找的「城市」列map和填補這些值:

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']) 

你需要做的原因是因爲它會提高一個錯誤,如果有重複的索引條目

+0

AttributeError的:只能使用名爲.str訪問字符串值,其使用在熊貓 – ComplexData

+0

np.object_ D型這意味着你可能有'NaN'值而不是空白字符串,如果是這樣的話,可以先替換這些'df ['zip_code'] = df ['zip_code']。fillna('')'那麼代碼應該可以工作 – EdChum

+0

仍然是一樣的錯誤 – ComplexData