根据同一行中另一列的值填充缺失值

时间:2017-02-26 16:37:16

标签: python pandas

我有一个DataFrame看起来像这样

ColA | ColB | ColC | ColD |
-----|------|------|------|
100  |   A  |  X1  |  NaN |
200  |   B  |  X2  |  AAA |
300  |   C  |  X3  |  NaN |

我想根据 ColA 的值填写 ColD 上的缺失值。我需要的结果是:

if value in ColA = 100 then value in ColD = "BBB"
if value in ColA = 300 then value in ColD = "CCC"

ColA | ColB | ColC | ColD |
-----|------|------|------|
100  |   A  |  X1  |  BBB |
200  |   B  |  X2  |  AAA |
300  |   C  |  X3  |  CCC |

2 个答案:

答案 0 :(得分:3)

您可以使用combine_firstfillna

df.ColD = df.ColD.combine_first(df.ColA)
print (df)
   ColA ColB ColC ColD
0   100    A   X1  100
1   200    B   X2  AAA
2   300    C   X3  300

或者:

df.ColD = df.ColD.fillna(df.ColA)
print (df)
   ColA ColB ColC ColD
0   100    A   X1  100
1   200    B   X2  AAA
2   300    C   X3  300

编辑:首先使用map代表Series s,然后使用combine_firstfillna Series

d = {100: "BBB", 300:'CCC'}
s = df.ColA.map(d)
print (s)
0    BBB
1    NaN
2    CCC
Name: ColA, dtype: object

df.ColD = df.ColD.combine_first(s)
print (df)
   ColA ColB ColC ColD
0   100    A   X1  BBB
1   200    B   X2  AAA
2   300    C   X3  CCC

它仅替换NaN

print (df)
   ColA ColB ColC ColD
0   100    A   X1  EEE <- changed value to EEE
1   200    B   X2  AAA
2   300    C   X3  NaN

d = {100: "BBB", 300:'CCC'}
s = df.ColA.map(d)
df.ColD = df.ColD.combine_first(s)
print (df)
   ColA ColB ColC ColD
0   100    A   X1  EEE
1   200    B   X2  AAA
2   300    C   X3  CCC

答案 1 :(得分:0)

定义映射函数:

def my_map_func(x):
    return "BBB" if x==100 else "CCC"

现在,df看起来像是:

ColA | ColB | ColC | ColD
-----|------|------|-----
100  |    A |   X1 |  NaN
200  |    B |   X2 |  AAA
300  |    C |   X3 |  NaN

选择具有NaN的行,并使用从列ColA

获取的映射值填充它
df.ix[df.ColD.isnull(), 'ColD'] = df.ix[df.ColD.isnull(), 'ColA'].apply(my_map_func)

在这里,我们基本上只选择那些 ColD 是NaN的行,方法是根据布尔序列索引并选择我们感兴趣的列 ColA 。简单语言, df.ix [selected_rows,selected_columns]

现在,dataframe df看起来像:

ColA | ColB | ColC | ColD
-----|------|------|-----
100  |    A |   X1 |  BBB
200  |    B |   X2 |  AAA
300  |    C |   X3 |  CCC