gpt4 book ai didi

python - 分配给 pandas DataFrame 的切片

转载 作者:太空狗 更新时间:2023-10-30 00:17:26 27 4
gpt4 key购买 nike

我正在尝试计算出任何给定日期的生效日期。数据框有一个由 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com