【问题标题】:Is there a way to efficiently apply a function to 3 million values in a Pandas column?有没有办法有效地将函数应用于 Pandas 列中的 300 万个值?
【发布时间】:2021-12-08 21:03:27
【问题描述】:

我目前正在研究如何赢得数据科学竞赛的数据科学课程。最后一个项目是我们必须参加的 Kaggle 比赛。

我的训练数据集有近 300 万行,其中一列是“购买日期”列。

我想计算每个日期到最近的公共假期的距离。

例如如果日期是 2014 年 12 月 31 日,则最接近的 PH 将是 2015 年 1 月 1 日。相隔的天数为“1”。

我想不出一种有效的方法来执行此操作。我有一个包含多个时间戳的列表,每个时间戳都是俄罗斯的公共假期(数据集来自俄罗斯)。

def dateDifference (target_date_raw):
    abs_deltas_from_target_date = np.subtract(russian_public_holidays, target_date_raw)
    abs_deltas_from_target_date = [i.days for i in abs_deltas_from_target_date if i.days >= 0]
    index_of_min_delta_from_target_date = np.min(abs_deltas_from_target_date)
    return index_of_min_delta_from_target_date

其中“russian_public_holidays”是公共假期日期列表,“target_date_raw”是我要计算到最近公共假期距离的日期。

这是我用来在 DataFrame 中为日期差异创建新列的代码。

training_data['closest_public_holiday'] = [dateDifference(i) for i in training_data['date']]

这段代码运行了将近 25 分钟,没有完成的迹象,这就是我向你们寻求帮助的原因。

我知道这可能是最不讨人喜欢的做事方式,但在我的研究过程中,我真的找不到在单个列上操作的干净方式。我看到很多人说在单个列上使用“应用”功能是一种不好的做事方式。我对处理如此大的数据集非常陌生,这就是为什么我现在似乎无法使用干净高效的做法。请让我知道解决此问题的最佳方法是什么!

【问题讨论】:

标签: python pandas data-science


【解决方案1】:

试试这个,看看是否有助于计时。我担心它会占用太多内存。我没有要测试的数据。你可以试试。

df = pd.DataFrame(pd.date_range('01/01/2021','12/31/2021',freq='M'),columns=['Date'])
holidays = pd.to_datetime(np.array(['1/1/2021','12/25/2021','8/9/2021'])).to_numpy()

假设假期:2021 年 1 月 1 日、2021 年 8 月 9 日、2021 年 12 月 25 日

df['Days Away'] = ( 
    np.min(np.absolute(df.Date.to_numpy()
        .reshape(-1,1) - holidays),axis=1) / 
        np.timedelta64(1, 'D') 
    )

【讨论】:

  • @KailashGautham 如果这对您有用,请检查勾选标记以接受答案。谢谢。
  • 感谢您的建议!这是我将您的代码转换为使用我的变量后的代码。 testing_df['closest_public_holiday'] = ( np.min(np.absolute(testing_df['date'].to_numpy().reshape(-1,1) - russian_public_holidays),axis=1) / np.timedelta64(1, 'D') ) 但是,我似乎遇到了这个奇怪的错误ufunc 'subtract' cannot use operands with types dtype('<M8[ns]') and dtype('O')
  • 你能在白天和节假日做 Dtype 并更新问题吗?
  • 我已经给了你我用来创建数据的代码。你也可以做一个 dtype 来比较数据类型,看看你的数据和我的数据之间的区别。基本上,必须转换为正确的类型。我怀疑你的假期是字符串,而不是隐藏的。
  • 另外,你有指向 Kaggle 数据集的链接吗?在执行此操作之前,您是否对数据集和假期应用了任何其他更改?如果你申请的是原始数据,那么我可以试试数据集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2012-07-28
  • 2020-07-31
相关资源
最近更新 更多