Я думаю, что вам нужно Index.union
для поиска конечных столбцов имен reindex
:
cols = dfa.columns.union(dfb.columns).union(dfc.columns)
print (cols)
Index(['a', 'b', 'c'], dtype='object')
Затем в цикле reindex
и приобщать новые DataFrames в список 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
добавить второе решение, может быть полезно тоже. – jezrael
Да, второе решение отлично! Но трюк с column.union тоже хорош. – alphanumeric
Да, я добавляю решение для NaN - помните о перезаписывании. – jezrael