将两个不相等的数据框与两个索引(日期时间和日期)上的部分公共元素合并

Posted

技术标签:

【中文标题】将两个不相等的数据框与两个索引(日期时间和日期)上的部分公共元素合并【英文标题】:Merge two unequal dataframes with partially common elements on the two indices (datetime and date) 【发布时间】:2020-01-29 03:51:11 【问题描述】:

我想在部分具有共同元素的两列上合并两个不同长度的数据框。

left_dataframe (A) 的索引是datetime 类型,相同的日期会出现多次但时间不同(因此,index.date 没有帮助)。

right_dataframe (B) 的索引是datetime.date 类型,并且每个日期都是不同的,正如预期的那样。

A=pd.DataFrame('datetime':['2019-06-01 18:11:55', '2019-06-01 21:43:02','2019-07-23 09:07:18', '2019-07-24 10:32:24'], \
                'value 1':[2, 5, 80, 0])

B=pd.DataFrame('date':['2019-06-01', '2019-07-23', '2019-07-24'], \
                'value 2':[10, 7, 3])

我需要在日期上合并两个数据框,特别是通过将 B 的元素放置在出现第一个新日期的行并用0 填充其余的相同日期不同时间,所以输出应该是这样的(连同 cmets):

           datetime  value 1  value 2
2019-06-01 18:11:55        2       10  #this is the first 2019-06-01 --> so it got the value of dataframe B
2019-06-01 21:43:02        5        0  #this is the second 2019-06-01 --> so the value 2 column got filled in with a 0 value
2019-07-23 09:07:18       80        7
2019-07-24 10:32:24        0        3

非常欢迎您的意见^_^

【问题讨论】:

【参考方案1】:

用途:

#convert columns to dates
B['date'] = pd.to_datetime(B['date']).dt.date
#convert to columns datetimes
A['datetime'] = pd.to_datetime(A['datetime'])

创建新列 - datetimes 从 ASeries.dt.date 中的 dates 用于匹配 B['date'] 和辅助列用于合并 dates 的重复项 GroupBy.cumcount

A['date'] = A['datetime'].dt.date
A['g'] = A.groupby('date').cumcount()
B['g'] = B.groupby('date').cumcount()

#print (A)
#print (B)

然后将DataFrame.merge与两列和左连接一起使用,删除辅助列并将添加列的缺失值转换为0Series.fillna

df = A.merge(B, on=['date','g'], how='left').drop(['date','g'], axis=1)
df['value 2'] = df['value 2'].fillna(0, downcast='int')
print (df)
             datetime  value 1  value 2
0 2019-06-01 18:11:55        2       10
1 2019-06-01 21:43:02        5        0
2 2019-07-23 09:07:18       80        7
3 2019-07-24 10:32:24        0        3

【讨论】:

非常感谢@jezrael 提供非常清晰和简短的代码。效果很好!

以上是关于将两个不相等的数据框与两个索引(日期时间和日期)上的部分公共元素合并的主要内容,如果未能解决你的问题,请参考以下文章

两个相同的 JavaScript 日期不相等

将 DateTime 与存储在数据库中的日期进行比较

在两列上创建索引以检查日期是不是介于这两个列之间

根据日期时间索引合并两个数据框(不同大小)

日期字段上的 Postgres DESC 索引

合并两个集合,如果元素重复,则选择日期最新的集合