【问题标题】:Python Dataframes merge multi matchPython Dataframes 合并多匹配
【发布时间】:2022-11-29 01:59:50
【问题描述】:

我是 Dataframe 的新手。 我想知道如何(如果可能的话)将 2 个数据帧与多个匹配项合并 例如

[df1]

date                  ZipCode Weather
2022-11-25 00:00:00   123456   34
2022-11-25 00:00:15   123456   35
2022-11-25 00:00:30   123456   36
[df2]
date                  ZipCode   host
2022-11-25 00:00:00   123456   host1
2022-11-25 00:00:00   123456   host2
2022-11-25 00:00:00   123456   host3
2022-11-25 00:00:15   123456   host1
2022-11-25 00:00:30   123456   host2
2022-11-25 00:00:30   123456   host3

预期成绩:

date                  ZipCode   host   Weather
2022-11-25 00:00:00   123456   host1   34
2022-11-25 00:00:00   123456   host2   34
2022-11-25 00:00:00   123456   host3   34
2022-11-25 00:00:15   123456   host1   35
2022-11-25 00:00:30   123456   host2   36
2022-11-25 00:00:30   123456   host3   36

我的目标是为每个主机分配天气措施。 我每 15 分钟测量一个邮政编码(一行)的天气 另一方面,我一次有几个主机 KPI 和一个邮政编码(多行)

我可以使用 Dataframes 执行此活动吗?

提前致谢!

【问题讨论】:

    标签: python dataframe merge multiple-columns


    【解决方案1】:

    您可以在 pandas 中使用 join 函数,它将一个数据帧的索引连接到另一个数据帧的索引。尝试类似的东西

    import pandas as pd
    
    data1 = 
    [['2022-11-25 00:00:00',  123456, 34],
    ['2022-11-25 00:00:15',  123456, 35],
    ['2022-11-25 00:00:30',  123456, 36]]
    
    columns1 =['date', 'ZipCode', 'Weather']
    
    data2 = 
    [['2022-11-25 00:00:00',  123456, 'host1'],
    ['2022-11-25 00:00:00',  123456, 'host2'],
    ['2022-11-25 00:00:00',  123456, 'host3'],
    ['2022-11-25 00:00:15',  123456, 'host1'],
    ['2022-11-25 00:00:30',  123456, 'host2'],
    ['2022-11-25 00:00:30',  123456, 'host3']]
    
    columns2 =['date', 'ZipCode', 'host']
    
    df1 = pd.DataFrame(data=data1, columns=columns1)
    df1.date = pd.to_datetime(df1.date)
    df1.set_index('date', inplace=True)
    df2 = pd.DataFrame(data=data2, columns=columns2)
    df2.date = pd.to_datetime(df2.date)
    df2.set_index('date', inplace=True)
    df3 = df1.join(df2['host'], on='date')
    df3
    

    【讨论】:

    • 谢谢!功能正常。我面临的问题是行不匹配,例如 data1 中没有日期,但 data2 中有主机。使用此解决方案仅在 df3 中保留所有匹配项,而不仅仅是“丰富”匹配项,这可能吗?
    【解决方案2】:

    我们通过使用 merge 并将参数 on 设置为 ['date', 'ZipCode'] 来做到这一点:

    new_df = pd.merge(df2, df1, on=['date', 'ZipCode'])
    

    输出

    >>> new_df
    ...      date           ZipCode host    Weather
    0   2022-11-25 00:00:00 123456  host1   34
    1   2022-11-25 00:00:00 123456  host2   34
    2   2022-11-25 00:00:00 123456  host3   34
    3   2022-11-25 00:00:15 123456  host1   35
    4   2022-11-25 00:00:30 123456  host2   36
    5   2022-11-25 00:00:30 123456  host3   36
    

    【讨论】:

    • 谢谢!功能正常,但不匹配的问题仍然存在。我试图用它来“玩”机器学习算法,在这种情况下我只有“匹配案例”。我想拥有我所有的主机并用与天气相关的内容丰富他们,如果我没有天气,请坚持与主机的线路与空天气
    【解决方案3】:

    经过几次测试,我得到了预期的结果

    new_df2 = pd.merge(df1, df2, on=['date', 'ZipCode'], how='right')
    

    谢谢你的指导!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      相关资源
      最近更新 更多