2017-04-27 88 views
2

此問題是Create multiple columns from a single column的延續。 現在假設我們有2個數據框,訓練和測試,我怎麼能夠爲每個列添加缺失的列? 問候,添加缺失列

編輯: 列車數據幀:

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

。成爲:

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

測試數據幀:

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

。成爲:

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

列車具有「Has_C」並且測試具有「Has_D」加上每個。

我想補充的Has_C列的測試和Has_D火車填補他們以0

+0

做兩遍...... – TheChetan

+0

有些值不存在於兩組 – datascana

+1

你能解釋更多嗎?一些示例數據是最好的。 – jezrael

回答

1

您可以使用DataFrame.assign()方法:

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()}) 

演示:

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

我認爲你需要reindex_axisreindexunioncolumns

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

使用'.reindex_axis(...)'是個好主意 - 我喜歡它 – MaxU

0

//取列不在train_df

COLS =列表(集(train_df.columns.values) - 集(test_df.columns.values))

//創建虛設數據幀和與train_df加入

pd.DataFrame([[0山口在COLS],列= COLS)。加入(test_df,如何= '外部')。fillna(0)

執行相同的過程train_df

希望它有幫助:)