2016-10-25 4 views
1

result dataframe должен быть комбинированный вариант из трех других dataframes: dfa, dfb и dfc и должно быть:Как Concat несколько Dataframes

 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?

ответ

2

Я думаю, что вам нужно Index.union для поиска конечных столбцов имен reindex:

cols = dfa.columns.union(dfb.columns).union(dfc.columns) 
print (cols) 
Index(['a', 'b', 'c'], dtype='object') 

Затем в цикле reindex и приобщать новые DataFrames в список DataFramesdfs, который наконец 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 
+0

добавить второе решение, может быть полезно тоже. – jezrael

+0

Да, второе решение отлично! Но трюк с column.union тоже хорош. – alphanumeric

+0

Да, я добавляю решение для NaN - помните о перезаписывании. – jezrael

Смежные вопросы