【问题标题】:efficient appending to pandas dataframes有效地附加到 pandas 数据帧
【发布时间】:2015-12-21 03:57:53
【问题描述】:

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

【问题讨论】:

    标签: python numpy pandas append


    【解决方案1】:

    您绝对不想做的是一次插入一行。您最终将在每次插入时制作数据框的完整副本。如果对于任何给定的行,您最多追加一个额外的行,您可以执行以下步骤:

    1) 从您的源加载数据框

    2) 将未初始化的数据帧附加到原始数据帧的末尾,长度相同

    3) 从原始数据帧的末尾(现在是中间)开始,将行复制到新位置,以便在每个原始行之间有一个额外的行(索引 10 -> 索引 20,索引 9 -> 索引 18等)

    4) 将所有奇数索引归零

    5) 运行您的算法,根据需要用您的数据填充空白行

    6) 最后,删除所有空白(全为 0)行

    这将有大约4个副本的有效效率,比每次插入一个副本要好得多。

    【讨论】:

    • 好。我想我可以使用开始日期和结束日期来计算现在分开的额外月份需要额外几个月的行数。 (有些需要重复多次。)我对切片仍然不聪明,但最终并没有那么难。
    【解决方案2】:

    不确定这是否是最佳解决方案,但我会制作一个单独的数据框。

    新的 DF:

    id                    start                     end          stay
     1      NaT                     NaT                          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          NaN
     1      NaT                     NaT                          NaN
     1      NaT                     NaT                          NaN
     2      NaT                     NaT                          NaN
     2      NaT                     NaT                          NaN
     2      NaT                     NaT                          NaN
    

    算法的第 2 步在月末拆分并插入。第 3 步计算停留时间。

    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
    

    然后选择没有 NaT/NaNs 的行并将其保存为最终的 Df。

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2023-04-10
      • 2020-08-30
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      相关资源
      最近更新 更多