【问题标题】:Python - Combining two Dataframes based on multiple columnsPython - 基于多列组合两个数据框
【发布时间】:2020-12-10 00:46:45
【问题描述】:

我知道有一种方法可以做到这一点,并且知道我以前做过,但我就是不知道怎么做,我也不知道如何专门用谷歌搜索它。所以如果有一个非常明显的答案,我很抱歉。

我想以我的输出为 DF3 的方式组合 DF1 和 DF2。简而言之:我希望将 DF2 中但不在 DF1 中的行与 DF2 的销售额一起添加到 DF1。并根据'Day'、'Month'和'Hour'列比较行的相似度。

两个数据框:

#Dataframe 1:
   Day  Month  Hour  Sales
0   10      7     1     12
1   10      7     2     14
2   10      7     3     10
3   10      7     5     18
4   10      7     6     12
5   10      7     7     22

#Dataframe 2:
   Day  Month  Hour  Sales
0   10      7     1      0
1   10      7     2      0
2   10      7     3      0
3   10      7     4      0
4   10      7     5      0
5   10      7     6      0
6   10      7     7      0
7   10      7     8      0

这是我想要的输出:

#Dataframe 3:
   Day  Month  Hour  Sales
0   10      7     1     12
1   10      7     2     14
2   10      7     3     10
3   10      7     4      0
4   10      7     5     18
5   10      7     6     12
6   10      7     7     22
7   10      7     8      0

可能有允许我这样做的合并、连接或类似操作,但我不记得了。 非常感谢任何帮助!

【问题讨论】:

    标签: python pandas dataframe join merge


    【解决方案1】:

    让我们在concat 之后做drop_duplicates

    df = pd.concat([df1,df2]).drop_duplicates(['Day','Month','Hour']).sort_values(['Day','Month','Hour'])
    Out[19]: 
       Day  Month  Hour  Sales
    0   10      7     1     12
    1   10      7     2     14
    2   10      7     3     10
    3   10      7     4      0
    3   10      7     5     18
    4   10      7     6     12
    5   10      7     7     22
    7   10      7     8      0
    

    merge 也可以使用

    df = df2.drop('Sales',1).merge(df1,on=['Day','Month','Hour'],how='left').fillna(0)
    df
    Out[26]: 
       Day  Month  Hour  Sales
    0   10      7     1   12.0
    1   10      7     2   14.0
    2   10      7     3   10.0
    3   10      7     4    0.0
    4   10      7     5   18.0
    5   10      7     6   12.0
    6   10      7     7   22.0
    7   10      7     8    0.0
    

    【讨论】:

    • 非常感谢您的快速回复!奇迹般有效!快速跟进问题:它如何知道删除具有“0”作为销售价值的重复列而不是具有来自 df_1 的值的列?
    • @0009 drop duplicate 将保留唯一的第一个重复行,当我连接时,我将 df1 放在第一个
    【解决方案2】:
    1. 为 DF1、DF2 创建辅助列“标签”,并结合列日、月和小时
    2. DF2 过滤器标签不在 DF1 的标签中
    3. 连接 DF1 和过滤的 DF2
    4. 删除辅助列“标签”
    for DF in [DF1, DF2]:
        DF['tag'] = ( DF.Day.astype(str)   + '-' 
                    + DF.Month.astype(str) + '-' 
                    + DF.Hour.astype(str)
                    )
    cond = ~ DF2.tag.isin(DF1.tag)
    DF3 = pd.concat([DF1, DF2[cond]], ignore_index=True)
    del DF3['tag']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-30
      • 2011-10-06
      • 2019-05-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2017-12-27
      相关资源
      最近更新 更多