2017-04-27 3 views
2

Diese Frage ist die Fortsetzung von Create multiple columns from a single column. Angenommen, wir haben jetzt zwei Datenrahmen, trainieren und testen, wie kann ich fehlende Spalten für jeden hinzufügen? Grüße,Fehlende Spalten hinzufügen

EDIT: Zug Datenrahmen:

  Products 
1   A;B 
2   A 
3   B;A;C 

Ist jetzt:

  Has_A  Has_B  Has_C 
1   1   1   0 
2   1   0   0 
3   1   1   1 

Test-Datenrahmen:

  Products 
1   A;B 
2   A 
3   D;A;B 

Ist jetzt:

  Has_A  Has_B  Has_D 
1   1   1   0 
2   1   0   0 
3   1   1   1 

Zug hat "Has_C" und Test hat "Has_D" in plus jeder.

Ich möchte die Has_C Spalte auf die Probe und die Has_D zum Zug hinzuzufügen, sie mit 0

+0

Do it double .... – TheChetan

+0

Einige Werte sind nicht in beiden Sets vorhanden – datascana

+1

Können Sie mehr erklären? Einige Beispieldaten sind die besten. – jezrael

Antwort

1

Füllen Sie DataFrame.assign() Methode verwenden können:

all_cols = train.columns.union(test.columns) 

train = train.assign(**{col:0 for col in all_cols.difference(train.columns).tolist()}) 
test = test.assign(**{col:0 for col in all_cols.difference(test.columns).tolist()}) 

Demo:

In [310]: train.assign(**{col:0 for col in all_cols.difference(train.columns).tolist()}) 
Out[310]: 
    Has_A Has_B Has_C Has_D 
1  1  1  0  0 
2  1  0  0  0 
3  1  1  1  0 

In [311]: test.assign(**{col:0 for col in all_cols.difference(test.columns).tolist()}) 
Out[311]: 
    Has_A Has_B Has_D Has_C 
1  1  1  0  0 
2  1  0  0  0 
3  1  1  1  0 
1

Ich denke, Sie brauchen reindex_axis oder reindex mit unioncolumns:

train = train['Products'].str.get_dummies(';').add_prefix('Has_') 
test = test['Products'].str.get_dummies(';').add_prefix('Has_') 

cols = train.columns.union(test.columns) 
print (cols) 
Index(['Has_A', 'Has_B', 'Has_C', 'Has_D'], dtype='object') 

train = train.reindex_axis(cols, axis=1, fill_value=0) 
print (train) 
    Has_A Has_B Has_C Has_D 
1  1  1  0  0 
2  1  0  0  0 
3  1  1  1  0 

test = test.reindex(columns=cols, fill_value=0) 
print (test) 
    Has_A Has_B Has_C Has_D 
1  1  1  0  0 
2  1  0  0  0 
3  1  1  0  1 
+0

Es ist eine sehr gute Idee, '.reindex_axis (...)' - ich mag es – MaxU

0

// Abruf Spalten nicht in train_df

cols = list (set (train_df.columns.values) - set (test_df.columns.values))

// erstellen dummy Datenrahmen und verbinden mit train_df

pd.DataFrame ([[0 für col in cols]], Säulen = cols) .join (test_df, wie 'äußere' =). fillna (0)

für denselben Prozess durchführen train_df

Hoffe es hilft :)

Verwandte Themen