【问题标题】:Creating a new date column based on a condition and an existing date column and time delta column根据条件和现有日期列和时间增量列创建新日期列
【发布时间】:2020-04-06 09:26:36
【问题描述】:

我的数据库看起来像 -

date                  Add
21-Dec-19       1-Month
13-Nov-19      3-Months

我想创建一个新列,'New',基于一个条件,如果日期小于指定日期,它应该添加添加列隐含的天数(以 timedelta 为单位)。

我使用的代码是-

df['date'] = pd.to_datetime(df['date'])
df['add'] = df['add'].mapp({'1-Month': np.timedelta64(30,'D'), '3-Months': np.timedelta64 (90,'D')})
def new(row):
   if df['date'] < pd.to_datetime('12/15/2019'):
      val == df['date'] + df['add']
   else:
      val == df['date']
return val

df.apply(lambda row:new(row), axis=1)

我收到以下错误

('一个Series的真值是不明确的。使用a.empty, a.bool(), a.item(), a.any() or a.all().', '发生在索引0 ')

任何想法都将不胜感激!

【问题讨论】:

  • 您从该错误消息中了解到什么?这是一个常见的问题,有很多关于这个主题的资源。
  • 你认为正确的代码应该是什么才能达到预期的结果?
  • 这是你想要的结果吗:0 2020-01-20 1 2020-02-11

标签: python pandas dataframe date conditional-statements


【解决方案1】:

您的代码有几个问题:

  • 您正在使用row 定义您的函数,但使用df。这意味着在为您的 if/else 语句进行比较时,该函数不知道如何正确评估条件。如果所有值都小于传递的值,我是否返回 True?如果任何值小于?这就是它返回歧义错误的原因。
  • 当您定义使用returnval 时,您只需要使用一个= 符号,因为2 会将val 与一个值进行比较,并且会返回一个错误,因为val 有从未被定义。
  • 对于这种情况,在使用apply时,不需要使用lambda,调用函数即可。

这应该适合你:

import pandas as pd  
import numpy as np
data = {'date':['21-Dec-19','13-Nov-19'],'add':['1-Month','3-Months']}  
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df['add'] = df['add'].map({'1-Month': np.timedelta64(30,'D'), '3-Months': np.timedelta64 (90,'D')})
def new(row):
    if row['date'] < pd.to_datetime('12/15/2019'):
        val = row['date'] + row['add']
    else:
        val = row['date']
    return val

df['new'] = df.apply(new,axis=1)
print(df)

输出:

        date     add        new
0 2019-12-21 30 days 2019-12-21
1 2019-11-13 90 days 2020-02-11

【讨论】:

  • 我确实使用了相同的代码,但仍然出现同样的错误!
  • 如果你是在复制和粘贴我的代码,你不应该这样做。我刚刚再次运行它,没有任何问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2018-09-16
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多