2015-10-10 113 views
3

考慮你有兩個列表(或pandas DataFrame中的列),每個列表都包含一些空值。您需要一個列表,它將一個列表中的空值替換爲另一個列表中的空值(如果存在另一列表中的空值)。使用python/pandas替換第二個列表中的缺失值

例子:

s1 = [1, NaN, NaN] 
s2 = [NaN, NaN, 3] 
## some function 
result = [1, NaN, 3] 

假設,如果兩個列表非空,在一些位置,那麼它們匹配,所以我們不必擔心解決衝突。如果是這樣,我知道我可以用一個列表理解解決這個問題:

[x if ~np.isnan(x) else y for (x,y) in zip(s1,s2)] 

,或者S1和S2的熊貓數據幀DF列,那麼我們就可以用類似的邏輯和應用功能:

df.apply(lambda x: x.s1 if ~np.isnan(x.s1) else x.s2, axis=1) 

但是有沒有更簡單的方法來做到這一點,也許使用一些熊貓的功能?這種手術甚至叫什麼?它有點像聯合體,但是在缺少替代品時保留了排序和空值。

回答

1

您可以使用pandas fillna功能填充其他列中的缺失值。

df = pd.DataFrame([[1,np.nan],[np.nan,np.nan],[np.nan,3]],columns=['c1','c2']) 
df['c1'].fillna(df['c2']) 
0

我最近不得不這樣做。根據列值的結構,您可能需要修改下面的內容。

import pandas as pd 

# example dataframe 
df = pd.DataFrame({'col': ['a', 'b', None, 'd', 'e', None, None]}) 

# null positions and list of values to replace nulls with 
nulls = df[pd.isnull(df.col)].index 
goodies = ['c', 'f', 'g'] 

# replace nulls with empty strings 
df['col'].fillna('', inplace=True) 

# augment empty strings to something we can keep track of 
SEP = '_' 
df['col'] = df.col + pd.Series([SEP + str(i) for i in df.index]) 

# create map to turn bad values good and then perform replacement 
salvation = {bad: good for bad, good in zip(df.ix[nulls].col, goodies)} 
df.replace(salvation, inplace=True) 

# remove everything including and after SEP string 
df['col'] = df.col.apply(lambda s: s.split(SEP)[0]) 

注意,在我的例子列包含字符串值,所以要根據您的數據類型,你應該轉換爲使用astype()方法字符串,然後回到你想要的東西時,你就大功告成了。另外,您可能需要更改SEP,以便在最後一行中不會以不需要的方式分割值。

相關問題