我正在尝试使用一些默认文本值填充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
我的代码在哪里出错?
答案 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