Python-替换联接上的NA不起作用

时间:2019-02-11 11:50:26

标签: python pandas

我正在尝试使用一些默认文本值填充NA的值。

这是我的df1

data = [['Alex','10'],['Bob','12'],['Clarke','13']]
df1 = pd.DataFrame(data,columns=['Id','Age'])

这是我的df2

data = [['Alex','10'],['Clarke','13']]
df2 = pd.DataFrame(data,columns=['Id','Age'])

这是我的df3

data = [['Alex','10']]
df3 = pd.DataFrame(data,columns=['Id','Age'])

这是此代码的输出

df4 = (pd.concat([df2.set_index('Id'), df3.set_index('Id')], axis=1).reindex(df1.Id, fill_value='IDNP').reset_index())

df1中的所有Id必须存在于df4中。

如果df2或df3中不存在ID,则将其替换为“ IDNP”。

这是我的代码输出,

       Id   Age   Age
0    Alex    10    10
1     Bob  IDNP  IDNP
2  Clarke    13   NaN

我想要的,

       Id   Age   Age
0    Alex    10    10
1     Bob  IDNP  IDNP
2  Clarke    13   IDNP

我的代码在哪里出错?

2 个答案:

答案 0 :(得分:1)

如果需要用concat创建索引来替换DataFrame列表中Id之后的所有缺失值,请使用:

dfs = [df1, df2, df3]
df4 = pd.concat([x.set_index('Id') for x in dfs], axis=1).fillna('IDNP')
print (df4)
       Age   Age   Age
Alex    10    10    10
Bob     12  IDNP  IDNP
Clarke  13    13  IDNP

您的解决方案会创建错值,因为它会返回pd.concat:

print ((pd.concat([df2.set_index('Id'), df3.set_index('Id')], axis=1)))
       Age  Age
Alex    10   10
Clarke  13  NaN

因此它不能被fill_value参数代替。

可能的解决方案是致电fillna

df4 = (pd.concat([df2.set_index('Id'), df3.set_index('Id')], axis=1)
         .fillna('IDNP')
         .reindex(df1.Id, fill_value='IDNP')
         .reset_index())

答案 1 :(得分:0)

您可以在连接之前通过df1.Id重新编制索引:

df4 = pd.concat([df2.set_index('Id').reindex(df1.Id, fill_value='IDNP'),
                 df3.set_index('Id').reindex(df1.Id, fill_value='IDNP')], axis=1).reset_index()

print(df4)

输出

       Id   Age   Age
0    Alex    10    10
1     Bob  IDNP  IDNP
2  Clarke    13  IDNP