我正在努力确定任何特定日期的生效日期。数据框 有一个由BMonthEnd填充的列(月的最后一个工作日) 考虑到假期 - 按照此处未显示的代码计算)
下面显示的部分数据框的EffectiveDate等于Date为1st 步骤
Date BMonthEnd EffectiveDate
2014-08-24 2014-08-24 2014-08-29 2014-08-24
2014-08-25 2014-08-25 2014-08-29 2014-08-25
2014-08-26 2014-08-26 2014-08-29 2014-08-26
2014-08-27 2014-08-27 2014-08-29 2014-08-27
2014-08-28 2014-08-28 2014-08-29 2014-08-28
2014-08-29 2014-08-29 2014-08-29 2014-08-29
2014-08-30 2014-08-30 2014-08-29 2014-08-30
2014-08-31 2014-08-31 2014-08-29 2014-08-31
我现在尝试选择需要更改的数据:
df[~(df.Date<df.BMonthEnd)].EffectiveDate # giving the expected slice
# but
df[~(df.Date<df.BMonthEnd)].EffectiveDate = 1
# gives error
SettingWithCopyWarning: A value is trying to be set on a copy of a slice
from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
self[name] = value
在警告之后我尝试了我尝试的替代方法:
df.loc[~(df.Date<df.BMonthEnd)].EffectiveDate = 1
这也会产生同样的错误。 (注意赋值中使用的1只是另一个函数的占位符),赋值不反映原始数据帧。我理解我正在有效地分配副本,以便它不会按预期更改原始数据帧。
但是,如何实现使用选择语法进行分配的目标。我真的不想迭代数据帧。
答案 0 :(得分:1)
想出来。在Dataframe中选择系列有效地允许我分配它和原始数据帧。这允许我使用切片语法来应用影响结果的逻辑:
# not all methods, classes shown
def effective_date(dr):
df = pd.DataFrame(dr, index=dr, columns=['Date'])
df['BMonthEnd'] = df.Date.apply(h.last_business_day)
df['MonthEnd'] = df.Date.apply(h.month_end)
df['EffectiveDate'] = df.Date
# df.EffectiveDate[~(df.Date<df.BMonthEnd)] = df.MonthEnd
df.loc[~(df.Date<df.BMonthEnd),'EffectiveDate'] = df.MonthEnd
return df.EffectiveDate
已根据Jeff的建议更新了它。现在看看为什么链索引会让你陷入困境。做了一些时间并且它们看起来更快,但是在分配到数据帧时.loc是更好的选择。