【问题标题】:In pandas, how to concatenate horizontally and then remove the redundant columns在熊猫中,如何水平连接然后删除冗余列
【发布时间】:2017-11-16 16:10:05
【问题描述】:

假设我有两个数据框。

DF1: col1, col2, col3,

DF2: col2, col4, col5

如何水平连接两个数据帧并拥有 col1、col2、col3、col4 和 col5?现在,我正在做 pd.concat([DF1, DF2], axis = 1) 但它最终有两个 col2。假设两个 col2 中的所有值都相同,我希望只有一列。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    删除重复项应该可以。因为 drop_duplicates 仅适用于索引,所以我们需要转置 DF 以删除重复项并将其转回。

    pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T
    

    【讨论】:

      【解决方案2】:

      difference 用于DF2 中不在DF1 中的列,然后通过[] 简单地选择它们:

      DF1 = pd.DataFrame(columns=['col1', 'col2', 'col3'])
      DF2 = pd.DataFrame(columns=['col2', 'col4', 'col5'])
      
      
      DF2 = DF2[DF2.columns.difference(DF1.columns)]
      print (DF2)
      Empty DataFrame
      Columns: [col4, col5]
      Index: []
      
      print (pd.concat([DF1, DF2], axis = 1))
      Empty DataFrame
      Columns: [col1, col2, col3, col4, col5]
      Index: []
      

      时间安排

      np.random.seed(123)
      
      N = 1000
      DF1 = pd.DataFrame(np.random.rand(N,3), columns=['col1', 'col2', 'col3'])
      DF2 = pd.DataFrame(np.random.rand(N,3), columns=['col2', 'col4', 'col5'])
      
      DF2['col2'] = DF1['col2']
      
      In [408]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T)
      10 loops, best of 3: 122 ms per loop
      
      In [409]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1))
      1000 loops, best of 3: 979 µs per loop
      

      N = 10000:
      In [411]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T)
      1 loop, best of 3: 1.4 s per loop
      
      In [412]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1))
      1000 loops, best of 3: 1.12 ms per loop
      

      【讨论】:

        【解决方案3】:

        为避免在连接两个数据帧时重复列,请使用 ignore_index 参数。

        pd.concat([df1, df2], ignore_index=True, sort=False)
        

        但仅在希望附加它们并忽略它们可能具有重叠索引的事实时才使用它

        【讨论】:

          【解决方案4】:
          DF2.drop(DF2.columns[DF2.columns.isin(DF1.columns)],axis=1,inplace=True)
          

          那么,

          pd.concat([DF1, DF2], axis = 1)
          

          【讨论】:

            猜你喜欢
            • 2018-03-11
            • 1970-01-01
            • 2020-06-23
            • 2021-09-06
            • 1970-01-01
            • 2014-12-08
            • 2021-11-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多