我有一个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 |
答案 0 :(得分:3)
您可以使用combine_first
或fillna
:
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_first
或fillna
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