我正在尝试计算出任何给定日期的生效日期。数据框 有一个由 BMonthEnd 填充的列(每月的最后一个工作日 考虑到假期 - 通过此处未显示的代码计算)
下面显示的部分数据框的有效日期等于第一个日期 步骤
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 只是另一个函数的占位符)并且赋值不会反射(reflect)在原始数据帧上。我知道我正在有效地分配给一个副本,这样它就不会按预期更改原始数据框。
但是,我如何实现使用选择语法进行分配的目标。我真的不想迭代数据框。
最佳答案
想通了。在数据框中有效地选择系列允许我分配给它和原始数据框。这允许我使用切片语法来应用影响结果的逻辑:
# 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 是更好的选择。
关于python - 分配给 pandas DataFrame 的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23566316/