【问题标题】:How can I efficiently tell if an index is a complete cartesian product如何有效地判断索引是否是完整的笛卡尔积
【发布时间】:2017-05-24 05:37:19
【问题描述】:

考虑数据框df

df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], [list('abb'), list('xxy')])

print(df)

     0  1
a x  1  2
b x  3  4
  y  5  6

df 的索引不是笛卡尔积。我可以生成一个

cp = pd.MultiIndex.from_product(df.index.levels, df.index.names)

但是,确定现有索引是否“完整”或是否所有级别都存在所有唯一值的有效方法是什么?


这对我如何选择unstack 一个系列或数据框有影响。如果索引是排序的并且是一个完整的笛卡尔积,那么我可以使用 numpy 技术来更有效地unstack,正如@Divakar here 所看到的那样。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    您可以通过检查索引是否唯一且具有正确数量的元素来确定索引是否完全是笛卡尔积:

    df.index.is_unique and (len(df) == np.prod(df.index.levshape))
    

    这不包括您的索引包含笛卡尔积(即具有重复索引的笛卡尔积)的情况。不过,您可以混入drop_duplicates 来处理这种情况,如下所示:

    len(df.index.drop_duplicates()) == np.prod(df.index.levshape)
    

    【讨论】:

    • 我没有意识到 levshape 存在 :-)
    【解决方案2】:

    一种方法是检查行数并与索引级别长度的乘积进行比较 -

    df.shape[0]==np.prod(list(map(len, df.index.levels)))
    

    【讨论】:

      【解决方案3】:
      #Re-index the df using a Multiindex with the full product and then compare length with the original df.
      
      len(df.reindex(pd.MultiIndex.from_product(df.index.levels),fill_value=np.nan))==len(df)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 2011-11-19
        • 2021-09-06
        • 2014-05-08
        • 2011-01-26
        • 1970-01-01
        • 2017-05-27
        相关资源
        最近更新 更多