有效地附加到 pandas 数据帧
Posted
技术标签:
【中文标题】有效地附加到 pandas 数据帧【英文标题】:efficient appending to pandas dataframes 【发布时间】: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
【问题讨论】:
【参考方案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。
【讨论】:
以上是关于有效地附加到 pandas 数据帧的主要内容,如果未能解决你的问题,请参考以下文章
python - 如何将 numpy 数组附加到 pandas 数据帧