我有一个像这样的数据帧,它是经过一些汇总和条件生成的,
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,即从D1
到D2
(包括两端),所有其他列应为0
对于第二行,我想对其他各列填充1
和0
,并在聚合数据框中的每一行填充201610至201612列。
如何使用熊猫更快,更有效地做到这一点?我宁愿不要遍历数据框,因为我的数据将很大。
如果填充现有数据框不理想,则如上所述生成数据框也可以达到我的目的。
答案 0 :(得分:1)
我无法想象如何不进行任何迭代。但是可以迭代初始数据框的行或结果数据框的列:
首先构建所有列都为0的结果数据框
resul = pd.DataFrame(data = 0, columns=pd.period_range(df.D1.min(), df.D2.max(), freq='M'),
index = df.index)
迭代初始数据帧的行:
for ix, row in df.iterrows():
resul.loc[ix, pd.period_range(row.D1, row.D2, freq='M')] = 1
迭代结果数据框的列
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