我陷入了我正在处理的项目的一部分,我有一个包含多个列的数据框,我想根据两个条件用另一列的值填充一列。
下面我尝试给出我的数据框的示例:我想将月份的最后一天添加到 Col [ ValuedteTo ] 中,该日期基于 Col [ Value Dte ] 中的日期(如果 Col [ Market ] 值)等于 EEX 或 ICE(或者简单地如果 Col [ ValuedteTo ] 为空,则添加日期)
很多 | 合同 | 价值数据 | 值得 | 市场 |
---|---|---|---|---|
-10 | 2024-03 | 2024-03-01 | EEX | |
10 | 2024-05 | 2024-05-01 | 冰 | |
-25 | 2024-10 | 2024-10-01 | 冰 | |
250 | 2024-11 | 2024-11-01 | 2024-11-10 | 场外交易 |
30 | 2024-02 | 2024-02-01 | 2024-02-02 | 场外交易 |
-10 | 2024-01 | 2024-01-01 | EEX | |
-50 | 2024-09 | 2024-09-01 | 2024-09-30 | 场外交易 |
-80 | 2024-10 | 2024-10-01 | EEX |
我尝试首先创建一个函数来根据特定日期获取一个月的最后一天 然后尝试将其与以下代码行一起使用。 但没有成功
df['valueDate_To_'] = df.apply(lambda x: last_day_of_month(df['valueDate_From_'])if (x['market'] == 'EEX' or x['market'] == 'ICE') else x['valueDate_To_'], axis = 1)
def last_day_of_month(any_day):
# The day 28 exists in every month. 4 days later, it's always next month
next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
# subtracting the number of the current day brings us back one month
return next_month - datetime.timedelta(days=next_month.day)
如果我理解你的问题是正确的。这就是解决方案:
下次请发布您的代码的最小复制品:
假设您有数据
df = pd.DataFrame(data)
df['Value_Dte'] = pd.to_datetime(df['Value_Dte'])
df['ValuedteTo'] = pd.to_datetime(df['ValuedteTo'], errors='coerce')
您给出的代码没有从日期时间对象中提取日期,我已经对此进行了修改。
def last_day_of_month(any_day):
next_month = any_day.replace(day=28) + timedelta(days=4)
return (next_month - timedelta(days=next_month.day)).date()
def fill_valuedteto(row):
if pd.isnull(row['ValuedteTo']) and row['Market'] in ['EEX', 'ICE']:
return last_day_of_month(row['Value_Dte'])
else:
return row['ValuedteTo']
df['ValuedteTo'] = df.apply(fill_valuedteto, axis=1)
这应该是它,或者如果你想要它与你的片段一起
df['valueDate_To_'] = df.apply(lambda x: last_day_of_month(x['ValuedteTo']) if (x['Market'] == 'EEX' or x['Market'] == 'ICE') else x['ValuedteTo'], axis=1)
请更改列名称,因为您没有提供可重现的示例来创建数据框。