【问题标题】:How to look up identical column names in two dataframes and combine the matched columns如何在两个数据框中查找相同的列名并组合匹配的列
【发布时间】:2019-12-26 03:46:46
【问题描述】:

我想循环遍历两个数据框的列名,找到具有相同列名的列,并将它们组合起来创建一个新的数据框。

我尝试在 for 循环中编写 if-else 条件,但它不起作用。

具体来说,我有两个这样的数据框:

df1 = pd.DataFrame({'A': {'2019Q1': 1, '2019Q2': 2, '2019Q3': 3},
                'B': {'2019Q1': 1, '2019Q2': 3, '2019Q3': 5},
                'C': {'2019Q1': 2, '2019Q2': 4, '2019Q3': 6}})

df2 = pd.DataFrame({'A': {'2019Q1': 4, '2019Q2': 5, '2019Q3': 6},
                'B': {'2019Q1': 1.5, '2019Q2': 3.3, '2019Q3': 5.6},
                'C': {'2019Q1': 2.3, '2019Q2': 4.8, '2019Q3': 6.7}})

我想要像下面这样的输出-

对于 A,输出=

pd.DataFrame({'df1': {'2019Q1': 1, '2019Q2': 2, '2019Q3': 3},
              'df2': {'2019Q1': 4, '2019Q2': 5, '2019Q3': 6}) 

对于 B,输出=

pd.DataFrame({'df1': {'2019Q1': 1, '2019Q2': 3, '2019Q3': 5},
              'df2': {'2019Q1': 1.5, '2019Q2': 3.3, '2019Q3': 5.6}) 

对于 C,输出=

pd.DataFrame({'df1': {'2019Q1': 2, '2019Q2': 4, '2019Q3': 6},
              'df2': {'2019Q1': 2.3, '2019Q2': 4.8, '2019Q3': 6.7})

非常感谢您的帮助!

【问题讨论】:

    标签: python pandas loops


    【解决方案1】:

    这是一种类似于 @ALollz 的方法,但将 subdf 保存在多个索引数据帧中

    s = pd.concat([df1, df2], keys=['df1', 'df2']).unstack(0)
    s.loc[:,'A']
    Out[390]: 
            df1  df2
    2019Q1    1    4
    2019Q2    2    5
    2019Q3    3    6
    

    【讨论】:

      【解决方案2】:

      concat 带键 + groupby。将结果存储在字典中,以列作为键。

      d = {idx: gp.droplevel(1, axis=1) for idx, gp in
           pd.concat([df1, df2], keys=['df1', 'df2'], axis=1).groupby(level=1, axis=1)}
      
      d['A']
      #        df1  df2
      #2019Q1    1    4
      #2019Q2    2    5
      #2019Q3    3    6
      
      d['B']
      #        df1  df2
      #2019Q1    1  1.5
      #2019Q2    3  3.3
      #2019Q3    5  5.6
      

      以上将为所有列创建框架,无论它们是否在两者中都找到。如果这没有用,您可以将 concat 更改为:

      cols = df1.columns.union(df2.columns)
      pd.concat([df1[cols], df2[cols]], axis=1, keys=['df1', 'df2'])
      

      【讨论】:

        【解决方案3】:

        由于两个数据框都按季度索引,您可以merge它们:

        for col in np.union1d(df1.columns, df2.columns):
            result = df1[[col]].merge(df2[[col]], how='outer', left_index=True, right_index=True)
            result.index.name = col
            result.columns = ['df1', 'df2']
            print(result)
        

        结果:

                df1  df2
        A               
        2019Q1    1    4
        2019Q2    2    5
        2019Q3    3    6
        
                df1  df2
        B               
        2019Q1    1  1.5
        2019Q2    3  3.3
        2019Q3    5  5.6
        
                df1  df2
        C               
        2019Q1    2  2.3
        2019Q2    4  4.8
        2019Q3    6  6.7
        

        【讨论】:

          【解决方案4】:

          您可以使用类似的逻辑,通过 (1) 遍历列并 (2) 如果它们同时存在于 df 中,则将它们传递给新的数据框。您可以将结果存储在字典中,其中键是列名:

          for col in all_cols:
              if col in df1.columns and col in df2.columns:
                  final_df[col] = pd.DataFrame({'df1': df1[col].values, 'df2': df2[col].values})
          
          final_df['A']
              df1     df2
          0   1       4
          1   2       5
          2   3       6
          
          final_df['B']
              df1     df2
          0   1       1.5
          1   3       3.3
          2   5       5.6
          
          final_df['C']
              df1     df2
          0   2       2.3
          1   4       4.8
          2   6       6.7
          

          【讨论】:

            【解决方案5】:
            for column in df1:
                if column in df2:
                    df = pd.DataFrame({"df1": df1[column].values, "df2": df2[column].values})
            

            【讨论】:

            • 您忘记检查该列是否存在于其他数据框中。这并不总是必要的
            猜你喜欢
            • 1970-01-01
            • 2021-07-22
            • 2021-03-04
            • 2021-12-28
            • 2023-03-24
            • 1970-01-01
            • 2021-03-20
            • 2019-06-06
            • 1970-01-01
            相关资源
            最近更新 更多