添加缺少的列

时间:2017-04-27 12:08:10

标签: python pandas numpy dataframe encoding

这个问题是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填充它们。

3 个答案:

答案 0 :(得分: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 :(得分:1)

我认为您需要reindex_axisreindex union columns

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

答案 2 :(得分:0)

//获取不在train_df中的列

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

//创建虚拟数据帧并使用train_df加入

pd.DataFrame([[col for cols] [] 0,columns = cols).join(test_df,how ='outer')。fillna(0)

为train_df执行相同的过程

希望有所帮助:)