分配到pandas DataFrames的切片

时间:2014-05-09 13:49:51

标签: python pandas

我正在努力确定任何特定日期的生效日期。数据框 有一个由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只是另一个函数的占位符),赋值不反映原始数据帧。我理解我正在有效地分配副本,以便它不会按预期更改原始数据帧。

但是,如何实现使用选择语法进行分配的目标。我真的不想迭代数据帧。

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是更好的选择。

相关问题