按日期列合并2个数据帧(无前瞻性偏差)

2024-05-04 08:41:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个python函数,该函数接受2个数据帧(dfA,dfB),并根据它们的日期列合并它们。合并时,B在A中查找与给定日期相等或早于给定日期的最近日期。这是为了防止dfAB中的数据展望未来(这就是为什么dfAB.iloc[4]['date']=1/4/21而不是1/9/21)

dfA

      date  i
0   1/1/21  0
1   1/3/21  0
2   1/4/21  0
3  1/10/21  0

dfB

     date  j  k
0  1/1/21  0  0
1  1/2/21  0  0
2  1/3/21  0  0
3  1/9/21  0  0
4  1/12/21 0  0

dfAB(注意,对于dfB的每一行,都有一行dfAB)

     date  j  k  i
0  1/1/21  0  0  0
1  1/1/21  0  0  0
2  1/3/21  0  0  0
3  1/4/21  0  0  0
4  1/10/21 0  0  0

列i、j、k中的值只是任意值


Tags: 数据函数date给定日期dfailocdfbdfab
1条回答
网友
1楼 · 发布于 2024-05-04 08:41:46

为此,我们可以使用pd.merge_asof和一些技巧将date列从dfB推回到dfAdate

# a.csv
date  i
1/1/21  0
1/3/21  0
1/4/21  0
1/10/21  0
# b.csv
date  j  k
1/1/21  0  0
1/2/21  0  0
1/3/21  0  0
1/9/21  0  0
1/12/21 0  0
# merge_ab.py
import pandas as pd

dfA = pd.read_csv(
    'a.csv',
    delim_whitespace=True,
    parse_dates=['date'],
    dayfirst=True,
)

dfB = pd.read_csv(
    'b.csv',
    delim_whitespace=True,
    parse_dates=['date'],
    dayfirst=True,
)

dfA['new_date'] = dfA['date']
dfAB = pd.merge_asof(dfB, dfA, on='date', direction='backward')
dfAB['date'] = dfAB['new_date']
dfAB = dfAB.drop(columns=['new_date'])

print(dfAB)
#         date  j  k  i
# 0 2021-01-01  0  0  0
# 1 2021-01-01  0  0  0
# 2 2021-03-01  0  0  0
# 3 2021-04-01  0  0  0
# 4 2021-10-01  0  0  0

这里pd.merge_asof正在做繁重的工作。我们正在向后合并dfB的行with the rows ofdfA. This should make it so the data in any row of dfABonly has data from equal to or before the corresponding row indfB. We do a little song and dance to copy the datecolumn indfAand then copy that over to thedatecolumn indfAB`以获得所需的输出

我并不100%清楚您是否需要direction='backward',因为您所有的示例数据都是0,但是如果它看起来不正确,您可以始终切换到direction='forward'

相关问题 更多 >