【问题标题】:Pandas - New Row for Each Day in Date RangePandas - 日期范围内每一天的新行
【发布时间】:2018-12-07 03:26:40
【问题描述】:

我有一个 Pandas df,其中一列 (Reservation_Dt_Start) 表示日期范围的开始,另一列 (Reservation_Dt_End) 表示日期范围的结束。

我想扩展每一行,使其包含与日期范围内的日期一样多的记录,而不是每一行都有一个日期范围,每个新行代表其中一个日期。

有关示例输入和所需输出,请参见下面的两张图片。

下面的代码 sn-p 有效!!但是,对于输入表中的每 250 行,运行需要 1 秒。鉴于我的输入表大小为 120,000,000 行,此代码将需要大约一周的时间才能运行。

pd.concat([pd.DataFrame({'Book_Dt': row.Book_Dt,
                         'Day_Of_Reservation': pd.date_range(row.Reservation_Dt_Start, row.Reservation_Dt_End),
                         'Pickup': row.Pickup,
                         'Dropoff' : row.Dropoff,
                         'Price': row.Price}, 

                          columns=['Book_Dt','Day_Of_Reservation', 'Pickup', 'Dropoff' , 'Price']) 
                          for i, row in df.iterrows()], ignore_index=True)

必须有一种更快的方法来做到这一点。有任何想法吗?谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

pd.concat 在具有大型数据集的循环中变得非常慢,因为它每次都会复制帧并返回一个新的数据帧。您正在尝试执行此操作 120m 次。我会尝试将这些数据作为一个简单的元组列表来处理,而不是在最后转换为数据框。

例如

给定一个列表list = []

对于数据框中的每一行:

  • 获取日期范围列表(这里仍然可以使用pd.date_range)存储在变量dates中,这是一个日期列表

  • 对于日期范围内的每个日期,将一个元组添加到列表list.append((row.Book_Dt, dates[i], row.Pickup, row.Dropoff, row.Price))

最后您可以将元组列表转换为数据框:

df = pd.DataFrame(list, columns = ['Book_Dt', 'Day_Of_Reservation', 'Pickup', 'Dropoff', 'Price'])

【讨论】:

  • 请注意,问题中的解决方案仅连接一次 - 它构造了一个数据帧的中间列表。如果您的解决方案更快,则可能是因为构建所有这些 DataFrame 的开销。
猜你喜欢
  • 1970-01-01
  • 2014-11-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多