【问题标题】:Removing symmetric pairs in DataFrame with MultiIndex使用 MultiIndex 删除 DataFrame 中的对称对
【发布时间】:2021-01-25 23:06:57
【问题描述】:

我有以下形式的pd.DataFrame,第 0 列中的数值不一定不同:

>>> idx = pd.MultiIndex.from_arrays([["a", "a", "b", "b", "c", "c"], ["b", "c", "a", "c", "a", "b"]])
>>> df = pd.DataFrame(list(range(6)), index=idx)
     0
a b  0
  c  1
b a  2
  c  3
c a  4
  b  5

我想剔除第一次出现的 2 个索引级别的唯一组合以获得如下结果:

     0
a b  0
  c  1
b c  3

在这种情况下使用 pandas 0.23.4 和 Python 3.6.5。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您可以使用Index.duplicated 将索引值转换为frozensets,然后过滤boolean indexing

    df = df[~df.index.map(frozenset).duplicated()]
    print (df)
         0
    a b  0
      c  1
    b c  3
    

    【讨论】:

      【解决方案2】:

      您可以处理索引值,类似于this question

      a = np.sort(df.index.to_list(), axis=1)
      df.groupby([a[:,0], a[:,1]], sort=False).first()
      

      或类似:

      mask = pd.DataFrame(np.sort(df.index.to_list(), axis=1)).duplicated()
      df[~mask.values]
      

      【讨论】:

        【解决方案3】:

        通过取消堆叠框架并使用 numpy 布尔索引找到了替代解决方案。

        df_u = df.unstack()
        df_u[~np.triu(np.ones(3), 1).astype(bool)] = np.nan
        df_u = df_u.stack().dropna()
        df_u
               0
        a b  0.0
          c  1.0
        b c  3.0
        

        我将检查所有选项,看看哪个选项执行得更快以选择答案。谢谢大家发帖!

        【讨论】:

          猜你喜欢
          • 2019-10-28
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          • 2022-06-11
          • 2019-08-02
          • 2021-12-25
          • 2013-01-22
          相关资源
          最近更新 更多