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

时间:2015-10-10 04:03:03

标签: python pandas

考虑您有两个列表(或pandas DataFrame中的列),每个列表都包含一些空值。您希望使用单个列表将一个列表中的空值替换为另一个列表中相应的非空值(如果存在)。

示例:

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是pandas DataFrame df中的列,那么我们可以使用类似的逻辑和apply函数:

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

但有没有更简洁的方法来做到这一点,也许使用一些熊猫功能?什么是这种操作甚至叫做?它有点像联合,但在缺少替代时保留排序和空值。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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,以免在最后一行中以不需要的方式拆分您的值。