pandas - 通过使用容差将两个带有日期时间的熊猫数据框与缺失数据合并
问题描述
我正在尝试将两个数据帧(df_in_A 和 df_in_B)与公共列('id'、'date')合并,但某些日期时间不匹配。我想要 df_output = df_in_A + df_in_B 的列 'data3' (与 'id' 和 'date' 匹配。如果 df_in_A 的日期时间不存在于 df_in_B => 取最后一个最接近的日期(公差 = 几天):
import pandas as pd
df_in_A = [
[1, '30/07/2021', 'A1', 'B1'],
[1, '31/08/2021', 'A2', 'B2'],
[1, '30/09/2021', 'A3', 'B3'],
[1, '31/10/2021', 'A4', 'B4'],
[2, '30/07/2021', 'A1', 'B1'],
[2, '31/08/2021', 'A2', 'B2'],
[2, '30/09/2021', 'A3', 'B3'],
[2, '31/10/2021', 'A4', 'B4']]
df_in_B = [
[1, '27/07/2021', 'C1'],
[1, '28/07/2021', 'C2'],
[1, '29/07/2021', 'C3'],
[1, '29/08/2021', 'C4'],
[1, '30/08/2021', 'C5'],
[1, '31/08/2021', 'C6'],
[1, '29/09/2021', 'C7'],
[1, '30/09/2021', 'C8'],
[1, '30/10/2021', 'C9'],
[2, '27/07/2021', 'C10'],
[2, '28/07/2021', 'C11'],
[2, '29/07/2021', 'C12'],
[2, '29/08/2021', 'C13'],
[2, '30/08/2021', 'C14'],
[2, '31/08/2021', 'C15'],
[2, '29/09/2021', 'C16'],
[2, '30/09/2021', 'C17'],
[2, '30/10/2021', 'C18']]
df_output = [
[1, '30/07/2021' 'A1' 'B1' 'C3'],
[1, '31/08/2021' 'A2' 'B2' 'C6'],
[1, '30/09/2021' 'A3' 'B3' 'C8'],
[1, '31/10/2021' 'A4' 'B4' 'C9'],
[2, '30/07/2021' 'A1' 'B1' 'C12'],
[2, '31/08/2021' 'A2' 'B2' 'C15'],
[2, '30/09/2021' 'A3' 'B3' 'C17'],
[2, '31/10/2021' 'A4' 'B4' 'C18']]
# Create the pandas DataFrame
df_in_A = pd.DataFrame(data_A, columns = ['id', 'date', 'data1', 'data2'])
df_in_B = pd.DataFrame(data_B, columns = ['id', 'date', 'data3'])
df_output = pd.DataFrame(data_B, columns = ['id', 'date', 'data3'])
我试过了:
- 与“ffill”合并但不工作,因为它用不同的 id 填充数据。
- merge_asof 但不工作,因为我有 2 把钥匙
解决方案
推荐阅读
- javascript - 如何在 React 中将图像作为道具传递?
- firebase - Flutter Firebase 存储图片检索流
- vba - Word VBA - 如果人们没有使用 DocumentBeforeSave 填写必填字段,如何阻止他们保存表单?
- javascript - 如何捕获所有组并将其替换为组的重新格式化版本?
- assembly - ARM 汇编中的 LDR 和 EQU
- javascript - 在不考虑小时、分钟或秒的情况下确定今天的 unix 时间的捷径?
- angular - 如何在 Angular HTTP post 方法标头中插入用户输入?
- android - 按三星bixby按钮发送tcp包
- java - 将字符串值存储到 JSON 类型的字段中
- c++ - 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)