python - 分配给 pandas DataFrame 的切片

标签 python pandas

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

相关文章:

python - 如何使用 geopandas 和 python 连接/合并多个压缩的 shapefile?

python - 在 pandas apply 函数中获取行的索引

python - Altair 默认调色板颜色(十六进制)

python - 如何获取用户在 django guardian 中具有特定权限的所有对象?

pandas 对 df 中的行重新排序

python - 如何在Python中迭代多个数据帧并将值添加到新数据帧

python - 通过检查多个条件更改 Pandas 列值

python - 根据条件更改列的值

python - 如何停止 Cherrypy 中的请求处理?

python - 在 python 中多重处理 shell 脚本