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