【问题标题】:Iterating over date ranges in pandas dataframe with for loop使用 for 循环迭代 pandas 数据框中的日期范围
【发布时间】:2019-10-08 06:03:32
【问题描述】:

我正在尝试遍历数据帧每一行中的时间戳,以查看该时间戳是在特定日期之前还是之后。另外,我想在数据框中创建一个新列,指定日期是在指定日期之前还是之后。

这是我正在使用的代码:

df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')

for row in df.iterrows():
        if df[(df['created_at'] >= '2019-03-15')]:
            df['within_date_range'] = "True"
        else:
            df['within_date_range'] = "False"

但是,上面的代码给了我这个错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

任何澄清将不胜感激。

【问题讨论】:

  • 为什么要循环? df['within_date_range'] = df.created_at.ge('2019-03-15')
  • 正如 ~@ALollz 评论的那样,您不需要循环执行此操作。但是如果您确实想循环,请注意在循环中您没有使用row,而是在每次迭代时查询整个数据帧。基本上,在if 子句中,您将传递为created_at 大于2019-03-15 的行过滤的数据框。显然,数据框不是 True 或 False,这就是为什么你会得到 The truth value of a DataFrame is ambiguous
  • 谢谢@ALollz。那成功了。我不知道 Pandas 大于等于函数。非常整洁:pandas.pydata.org/pandas-docs/stable/reference/api/…

标签: pandas dataframe loops


【解决方案1】:

正如 cmets 中所述,您确实不需要循环。 但是回答你的确切问题,你的错误来源是这个表达式: if df[(df['created_at'] >= '2019-03-15')]:

事实上,df[some_condition_here] 操作会返回一个新的DataFrame,不清楚如何将DataFrame 转换为boolean(它也适用于任何类:是@ 987654326@实例真假?)

这就是您收到错误的原因。

【讨论】:

  • 非常感谢您的澄清。这是有道理的。 @ALollz 在上面提出了一个答案,但我很想知道 for 循环应该采取什么形式才能逐行正常工作?
【解决方案2】:

或者你也可以使用 np.where 函数来获取条件

df['within_date_range'] = np.where(df['created_at'] >= '2019-03-15', 'True', 'False')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2020-02-17
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多