我正在尝试用一些默认文本值填充 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 中。
如果 Id 在 df2 或 df3 中不存在,则它将被替换为"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
我的代码哪里出错了?
如果需要,请按DataFrame
列表concat
后的所有缺失值替换为创建索引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())
您可以在连接之前按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