子集数据帧扩展/切片以匹配原始数据帧列

时间:2017-11-23 16:45:50

标签: python pandas

问题:

  

我在数据集上训练了一个分类器,其功能多于测试   数据。例如,我的原始数据集一周有7天:   周一至周日,在测试数据集中,每个观察点   恰好是星期四(因此我减少了6个功能)。因此,当我   运行predict(),我得到一个错误,功能的数量没有   比赛。这些缺少的功能是未创建的功能   使用get_dummies()

Day_of_the_week_is_monday, Day_of_the_week_is_tuesday, ... 

理想情况下,我想执行数据清理并执行以下操作:

  • 自动创建缺少的列,填充0。 (以来 is_Thursday将全部为1,其余应为0)
  • 删除任何 '额外'子集数据帧中的列,不存在于 原始训练数据。例如,get_dummies()可能会在子集数据框中创建更多级别,我想删除它。

可重复的示例

dataframe = pd.DataFrame({
                          'Result' : np.array([1,2,2,10,100],dtype='int32'),
                          'Day_of_the_week' : pd.Categorical(["Monday","Tuesday","Wednesday","Thursday","Friday"]),})

dataframe_dummies = pd.get_dummies(dataframe, prefix=['Day_of_the_week_is'])

### get subset dataframe

dataframe_subset = pd.DataFrame({
                          'Result' : np.array([1,2,2,10],dtype='int32'),
                          'Day_of_the_week' : pd.Categorical(["Thursday","Thursday","Thursday","Saturday"]),})

dataframe_subset_dummies = pd.get_dummies(dataframe_subset, prefix=['Day_of_the_week_is'])

主数据集如下所示:

   Result  Is_Friday  Is_Monday  Is_Thursday  Is_Tuesday  Is_Wednesday
0       1          0          1            0           0             0
1       2          0          0            0           1             0
2       2          0          0            0           0             1
3      10          0          0            1           0             0
4     100          1          0            0           0             0

子集数据框

   Result  Day_is_Saturday  Day_is_Thursday
0       1                0                1
1       2                0                1
2       2                0                1
3      10                1                0

必须做什么:

1)删除is_Saturday,因为它不在原始数据中。

2)添加填充0s的剩余cols。

我可以手动完成,但看起来很麻烦。有功能可以为我做这个吗?例如。扩展子集数据帧以匹配主数据集,或删除cols以匹配主数据?

1 个答案:

答案 0 :(得分:1)

一个简单的循环和检查应该可以添加缺少的列并删除缺少的列:

In [16]: a = pd.DataFrame([[1,2,3],[2,3,4]], columns=['A', 'B', 'E'])

In [17]: b = pd.DataFrame([[3,4,5],[4,5,6]], columns=['A', 'B', 'C'])

In [18]: for col in b.columns:
    ...:     if col not in a:
    ...:         a[col] = 0
    ...:

In [19]: for col in a.columns:
    ...:     if col not in b:
    ...:         del a[col]
    ...:

In [20]: a
Out[20]:
   A  B  C
0  1  2  0
1  2  3  0