我看到数据框有.pop方法但.append返回一个新对象(与列表不同)。在我添加行时,不断为数据帧重新分配内存可能效率低下(另请参阅this answer测试预分配空间以回复similar question)。但是我需要复制(然后修改)一些行,正如我在another question中所概述的那样(下面重复的例子) - 将数据追加到数据帧的末尾或其他方式是否有效?
我想从中得到(关注id 2):
id start end
1 2011-01-01 10:00:00 2011-01-08 16:03:00
2 2011-01-28 03:45:00 2011-02-04 15:22:00
3 2011-03-02 11:04:00 2011-03-05 05:24:00
对此:
id start end month stay
1 2011-01-01 10:00:00 2011-01-08 16:03:00 2011-01 7
2 2011-01-28 03:45:00 2011-01-31 23:59:59 2011-01 4
2 2011-02-01 00:00:00 2011-02-04 15:22:00 2011-02 4
3 2011-03-02 11:04:00 2011-03-05 05:24:00 2011-03 3
答案 0 :(得分:3)
您绝对不想做的是一次插入一行。您最终会在每次插入时制作数据帧的完整副本。如果对于任何给定的行,您最多会追加一行,则可以执行以下步骤:
1)从源
加载数据框2)将未初始化的数据框附加到原始数据框的末尾,长度相同
3)从原始数据帧(现在是中间)的末尾开始,将行复制到新位置,使得在每个原始行之间存在额外的行(索引10 - >索引20,索引9 - >指数18等)
4)将所有奇数指数归零
5)运行算法,根据需要用数据填充空白行
6)最后,删除所有空白(所有0' s)行
这将具有大约4个拷贝的有效效率,比每个插入物的拷贝好得多。
答案 1 :(得分:0)
不确定这是否是最佳解决方案,但我会制作一个单独的数据框。
新DF:
id start end stay
1 2011-01-01 10:00:00 2011-01-08 16:03:00 NaN
1 NaT NaT NaN
1 NaT NaT NaN
2 NaT NaT NaN
2 NaT NaT NaN
2 NaT NaT NaN
算法的第1步只是插入不超过一个月的日期:
id start end stay
1 2011-01-01 10:00:00 2011-01-08 16:03:00 7
1 NaT NaT NaN
1 NaT NaT NaN
2 2011-01-28 03:45:00 2011-01-31 23:59:59 4
2 2011-02-01 00:00:00 2011-02-04 15:22:00 4
2 NaT NaT NaN
算法的第2步在月末分割并插入。第3步计算停留时间。
encoding/
然后选择没有NaT / NaN的行并将其保存为最终的Df。