根据汇总的数据框填充数据框

时间:2019-07-02 07:11:03

标签: python pandas dataframe

我有一个像这样的数据帧,它是经过一些汇总和条件生成的,

X      P       D1           D2
1      A    2016-06-02   2016-07-26
2      A    2016-10-04   2016-12-01
3      A    2016-12-13   2017-03-11
1      B    2017-03-04   2018-01-11

从这个数据帧中,我必须填充另一个具有n列数的数据帧,其中每列为一个月,在[201606, 201607,......, 201801]范围内,这是先前进行的。即我已经有一个如上所述的列的数据框。我要填充该数据框。

我想为聚合数据框中的每个记录创建一行,其中X,P的组合在整个聚合数据框中都是唯一的。

对于第一条记录,我想用1填充列201606至201607,即从D1D2(包括两端),所有其他列应为0

对于第二行,我想对其他各列填充10,并在聚合数据框中的每一行填充201610至201612列。

如何使用熊猫更快,更有效地做到这一点?我宁愿不要遍历数据框,因为我的数据将很大。

如果填充现有数据框不理想,则如上所述生成数据框也可以达到我的目的。

1 个答案:

答案 0 :(得分:1)

我无法想象如何不进行任何迭代。但是可以迭代初始数据框的行或结果数据框的列:

首先构建所有列都为0的结果数据框

resul = pd.DataFrame(data = 0, columns=pd.period_range(df.D1.min(), df.D2.max(), freq='M'),
                     index = df.index)
  1. 迭代初始数据帧的行:

    for ix, row in df.iterrows():
        resul.loc[ix, pd.period_range(row.D1, row.D2, freq='M')] = 1
    
  2. 迭代结果数据框的列

    for c in resul.columns:
        resul[c] = np.where((c.end_time>=df.D1)&(c.start_time <= df.D2), 1, 0)
    

在这两种情况下,您的示例数据均按预期给出:

   2016-06  2016-07  2016-08  2016-09  2016-10  2016-11  2016-12  2017-01  2017-02  2017-03  2017-04  2017-05  2017-06  2017-07  2017-08  2017-09  2017-10  2017-11  2017-12  2018-01
0        1        1        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0        0
1        0        0        0        0        1        1        1        0        0        0        0        0        0        0        0        0        0        0        0        0
2        0        0        0        0        0        0        1        1        1        1        0        0        0        0        0        0        0        0        0        0
3        0        0        0        0        0        0        0        0        0        1        1        1        1        1        1        1        1        1        1        1

这两种方法之间的选择将是较短的迭代:如果初始数据帧的行数少于resul数据帧的列数,则选择方法1,否则选择方法2