python - 使用现有列将 lambda 应用于新列
问题描述
数据库是 rv 列是 'NextResetDate_rv'(datetime),'RateResetFreq_rv'(timedelta) me1 是 pd.to_datetime('12/31/2019')
我正在尝试根据条件创建一个新列“resetcalc1_rv”,但无法正确获取代码,请您指出哪里出了问题
基本上 'rvresetcalc1_rv' 应该等于 'NextResetDate_rv 只要它落在 2019 年 12 月 31 日之后,否则需要添加 'RateResetFreq_rv' 直到满足条件
rv['resetcalc1_rv'] = rv['NextResetDate_rv']
def new1(row):
while row['resetcalc1_rv'] < me1:
row['resetcalc1_rv'] = row['NextResetDate_rv'] + row['RateResetFreq_rv']
if row['resetcalc1_rv'] >= me1:
break
row['resetcalc1_rv']
rv['resetcalc1_rv'] = rv.apply(lambda row:new1(row), axis=1)
现在所有行的输出都是“无”
解决方案
您可以避免 while 循环。'RateResetFreq_rv'
使用减法和整数除法,您可以找到每行需要添加多少个单位才能满足条件。clip(lower=0)
确保我们不会更改已经在指定日期之后的日期。然后您可以一次计算所有值。
样本数据
import pandas as pd
df = pd.DataFrame({'NextResetDate_rv': pd.date_range('2019-11-01', periods=8, freq='15D'),
'RateResetFreq_rv': pd.to_timedelta(np.arange(31,23,-1), unit='D')})
代码
s = (((pd.to_datetime('2019-12-31') - df['NextResetDate_rv']).dt.days)//df['RateResetFreq_rv'].dt.days).add(1).clip(lower=0)
df['resetcalc1_rv'] = df['NextResetDate_rv'] + s*df['RateResetFreq_rv']
输出
NextResetDate_rv RateResetFreq_rv resetcalc1_rv
0 2019-11-01 31 days 2020-01-02
1 2019-11-16 30 days 2020-01-15
2 2019-12-01 29 days 2020-01-28
3 2019-12-16 28 days 2020-01-13
4 2019-12-31 27 days 2020-01-27
5 2020-01-15 26 days 2020-01-15
6 2020-01-30 25 days 2020-01-30
7 2020-02-14 24 days 2020-02-14
推荐阅读
- reactjs - 使用 getStream.io React 组件时出现异常
- database - UserConsent 的数据库设计
- vba - 在 DoCmd 中调用字段/表
- excel - 我正在尝试对插入的空行下方的数据执行 vlookup
- oracle - 如何修复在期望以下之一时遇到符号“WHERE”和{
- c# - 每 x 秒在后台线程上运行方法
- xml - 如何在经典 asp 中解析 reddit RSS 提要?
- c++ - 用坚实的原则用 arduino 写作
- angular - 捕获的 Angular 2 错误的堆栈跟踪不可用。更好的方法?
- html - 当鼠标悬停在图像上时,使文本位于图像中间