Figured it out. Selecting out the Series in the Dataframe effectively allows me to assign to it and the original dataframe. this allows me to use the slicing syntac to apply logic influencing the results:
# 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
Have Updated it with Jeff's suggestion. See now why chain indexing can get you into trouble. Have done a few timeits and they seem to be faster, but when assigning to the dataframe .loc is the better option.