有效附加到pandas数据帧

时间:2015-09-23 17:49:48

标签: python numpy pandas append

我看到数据框有.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

2 个答案:

答案 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。