如何有效地判断索引是否是完整的笛卡尔积

时间:2017-05-23 19:45:51

标签: python pandas numpy

考虑数据框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所示。

3 个答案:

答案 0 :(得分:2)

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

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

这不包括您的索引包含笛卡儿积(即具有重复索引的笛卡尔积)的情况。你可以混合使用drop_duplicates来处理这种情况,但是:

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

答案 1 :(得分:1)

一种方法是检查行数并与指数水平长度的乘积进行比较 -

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

答案 2 :(得分:1)

#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)