这个问题是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 :(得分: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_axis
或reindex
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执行相同的过程
希望有所帮助:)