Python 在两列上使用loc执行替换另一列值的计算

Python 在两列上使用loc执行替换另一列值的计算,python,dataframe,Python,Dataframe,我在这条路上走得太久了。我所要做的就是创建一个名为durationtargetdate的新列,该列源自标准工期天数+创建的日期/时间。以下是我目前的代码: 根据我的观点,我认为这段代码将从0迭代到数据帧的长度。如果标准持续时间天数列中没有“设置标准持续时间”,则转到我的else语句,并用空白覆盖给定单元格(与我初始化该单元格相同)。但是,如果代码意识到存在“未设置标准持续时间”以外的任何内容,则应将标准持续时间天数列中给定单元格的值与创建的日期/时间列相加。我希望新值位于相应索引的新列工期目标日

我在这条路上走得太久了。我所要做的就是创建一个名为
durationtargetdate
的新列,该列源自
标准工期天数
+
创建的日期/时间
。以下是我目前的代码: 根据我的观点,我认为这段代码将从0迭代到数据帧的长度。如果
标准持续时间天数
列中没有“设置标准持续时间”,则转到我的else语句,并用空白覆盖给定单元格(与我初始化该单元格相同)。但是,如果代码意识到存在“未设置标准持续时间”以外的任何内容,则应将
标准持续时间天数
列中给定单元格的值与
创建的日期/时间
列相加。我希望新值位于相应索引的新列
工期目标日期

newDF["Duration Target Date"] = ""

for i in range(0,len(newDF)):
    if newDF.loc[i,"Standard Duration Days"] != "No Set Standard Duration":
        newDF.loc[i,"Duration Target Date"] = (timedelta(days = int(newDF.loc[i,"Standard Duration Days"])) + newDF.loc[i,"Date/Time Created"])
    else:
        newDF.loc[i,"Duration Target Date"] == ""


我注意到这部分起作用,但后来它最终停止工作。。。当我运行此命令时,也会出现一个错误:“KeyError 326”

这里有几个问题。首先,看起来您将
loc
iloc
混淆了。很容易做到
loc
通过实际索引查找,实际索引可能是也可能不是整数位置索引。但是您的
i在范围(0,len(newDF))
中通过整数位置索引进行迭代。所以您得到的是
keyerror326
,因为您得到的是数据帧的第326行,但它的索引实际上不是326。您可以通过查看
打印(newDF.iloc[320:330])
来检查这一点

第二个也是更重要的问题:您几乎不想在数据帧中迭代行。相反,使用一次应用于完整列的矢量化函数。对于需要条件赋值的情况,相关函数为
np。其中

boolean_filter = newDF.loc[:,"Standard Duration Days"] != "No Set Standard Duration"
value_where_true = (timedelta(days = newDF.loc[:,"Standard Duration Days"].astype('int'))) + newDF.loc[:,"Date/Time Created"])
value_where_false = ""

newDF["Duration Target Date"] = np.where(boolean_filter, value_where_true, value_where_false) 
以下是使用行方式的一种方法:

newDF['Standard Duration Days'] = newDF['Standard Duration Days'].astype(int)

newDF['Duration Target Date'] = (newDF
                                .apply(lambda x:, x["Standard Duration Days"] + x["Date/Time Created"] if x["Standard Duration Days"] != "No Set Standard Duration" else None,axis=1)

注意:由于您没有提供任何数据,因此未对其进行测试。

我只需添加列,并保留
NaT
(非时间)错误


将文本添加到数字列会将整个列转换为
对象
,这会占用更多内存,效率更低。通常,我们希望将空值保留为
np.nan
,或者在整数的情况下可能保留一个前哨值。只有出于显示目的,才会转换这些数据,例如,
df['Duration Target Date'].fillna(“”)

当我运行此操作时,我会得到KeyError“Standard Duration Days”。有什么原因可以解释我为什么会这样吗?我想我的语法更新应该已经修复了它。再试一次?我重新运行它,现在收到ValueError:“无效的文本,以10为基数的int():“没有设置标准持续时间”
df = pd.DataFrame({
    "Standard Duration Days": [3, 5, "No Set Standard Duration"],
    "Date/Time Created": ['2019-01-01', '2019-02-01', '2019-03-01']
})

# 1. Convert string dates to pandas timestamps.
df['Date/Time Created'] = pd.to_datetime(df['Date/Time Created'])

# 2. Create time deltas, coercing errors.
delta = pd.to_timedelta(df['Standard Duration Days'], unit='D', errors='coerce')

# 3. Create new column by adding delta to 'Date/Time Created'.
df['Duration Target Date'] = (df['Date/Time Created'] + delta).dt.normalize()

>>> df
     Standard Duration Days Date/Time Created Duration Target Date
0                         3        2019-01-01           2019-01-04
1                         5        2019-02-01           2019-02-06
2  No Set Standard Duration        2019-03-01                  NaT