result
数据框应该是其他三个数据框的组合版本:dfa
,dfb
和dfc
,它应该是:
a b c
0 1.0 0.0 0
1 0 10.0 0
2 0 0 100
不幸的是,下面的代码会产生不同的结果:
result = pd.DataFrame()
dfa = pd.DataFrame({'a':[1]})
dfb = pd.DataFrame({'b':[10]})
dfc = pd.DataFrame({'c':[100]})
for df in [dfa, dfb, dfc]:
result = result.reindex(columns=df.columns, fill_value=0)
result = pd.concat([result, df], ignore_index=True)
print result
以下是结果:
c
0 0
1 0
2 100
可以采取哪些措施来获得result
?
答案 0 :(得分:3)
我认为您需要Index.union
来查找reindex
的最终列名:
cols = dfa.columns.union(dfb.columns).union(dfc.columns)
print (cols)
Index(['a', 'b', 'c'], dtype='object')
然后在循环reindex
中将新的DataFrame添加到DataFrames
dfs
的列表中,最后是concat
:
dfs = []
for df in [dfa, dfb, dfc]:
result = df.reindex(columns=cols, fill_value=0)
dfs.append(result)
result = pd.concat(dfs, ignore_index=True)
print (result)
a b c
0 1 0 0
1 0 10 0
2 0 0 100
如果数据框dfa
,dfb
和dfc
不是NaN
值,您可以使用DataFrame.fillna
,但更常见的是使用NaN
是第一个解决方案:
result = pd.concat([dfa, dfb,dfc], ignore_index=True).fillna(0).astype(int)
print (result)
a b c
0 1 0 0
1 0 10 0
2 0 0 100
NaN
示例:
dfa = pd.DataFrame({'a':[1]})
dfb = pd.DataFrame({'b':[10]})
dfc = pd.DataFrame({'c':[np.nan]})
cols = dfa.columns.union(dfb.columns).union(dfc.columns)
dfs = []
for df in [dfa, dfb, dfc]:
result = df.reindex(columns=cols, fill_value=0)
dfs.append(result)
result = pd.concat(dfs, ignore_index=True)
print (result)
a b c
0 1 0 0.0
1 0 10 0.0
2 0 0 NaN
#data NaN are overwrite by 0
print (pd.concat([dfa, dfb,dfc], ignore_index=True).fillna(0).astype(int))
a b c
0 1 0 0
1 0 10 0
2 0 0 0