如何连接多个Dataframe

时间:2016-10-25 05:36:20

标签: python pandas dataframe

result数据框应该是其他三个数据框的组合版本:dfadfbdfc,它应该是:

     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

1 个答案:

答案 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

如果数据框dfadfbdfc不是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