使用python/pandas替换第二个列表中缺少的值

使用python/pandas替换第二个列表中缺少的值,python,pandas,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)

假设您有两个列表(或数据帧中的列),每个列表包含一些空值。您需要一个列表,该列表将一个列表中的空值替换为另一个列表中相应的非空值(如果存在)

例如:

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)

但是有没有一种更干净的方法来做到这一点,也许是使用一些熊猫的功能?这种手术叫什么?它有点像一个并集,但在缺少替代项时保留顺序和空值

我最近不得不这么做。根据列值的结构,您可能需要调整我在下面列出的内容

将熊猫作为pd导入
#示例数据帧
df=pd.DataFrame({'col':['a','b','None','d','e',None,None]})
#空位置和用以替换空值的值列表
nulls=df[pd.isnull(df.col)].index
糖果=['c','f','g']
#用空字符串替换空值
df['col'].fillna('',inplace=True)
#将空字符串添加到我们可以跟踪的内容
SEP='''
df['col']=df.col+pd.Series([SEP+str(i)表示df.index中的i])
#创建映射以将坏值变为好值,然后执行替换
savation={bad:good for bad,good in zip(df.ix[nulls].col,goodies)}
df.replace(拯救,原地=真)
#删除所有内容,包括SEP字符串和SEP字符串之后的内容
df['col']=df.col.apply(lambda s:s.split(SEP)[0])

请注意,在我的示例中,列包含字符串值,因此根据您的数据类型,您应该使用
astype()
方法将其转换为字符串,然后在转换完成后返回到所需的值。此外,您可能需要更改
SEP
,以便在最后一行中不会以不需要的方式拆分值。

您可以使用fillna功能来填充其他列中缺少的值

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