使用pd.pivot_table后出现意料之外的重复项

编程语言 2026-07-08

我有一个数据集,看起来是这样的:

>>> df_anon.head()
    a   b   c   d
0   1   30  1   929.3453
1   1   30  3   875.3986
2   1   30  5   849.9972
3   1   51  1   571.8364
4   1   51  2   508.9944

>>> df_anon[["a", "b", "c"]].nunique()
a    16665
b       61
c        6
dtype: int64

>>> df_anon.dtypes
a      int64
b      int64
c      int64
d    float64
dtype: object

>>> df_anon.groupby(["a", "b", "c"]).size().sort_values()
a      b   c
1      30  1    1
11114  35  1    1
       27  5    1
           3    1
           1    1
               ..
5571   51  4    1
           3    1
           2    1
5573   13  1    1
16665  33  6    1
Length: 112491, dtype: int64

因此三元组 (a, b, c) 是唯一的(尽管并非每种组合都存在)。当我对这个表进行透视时,仍然会得到重复项,然而:

>>> df_anon_pivoted = df_anon.pivot_table(
    index=["a", "b"],
    columns=["c"],
    values=["d"],
)

>>> df_anon_pivoted.index.value_counts()
a     b 
1395  21    6
1855  20    6
1856  1     6
      35    6
1857  8     6
           ..
937   57    6
938   34    6
2794  55    6
2795  54    2
1     30    1
Name: count, Length: 4169, dtype: int64

这里的 (a, b) 索引难道不应该是唯一的吗,因为 c 的值被映射到不同的列?我还发现透视后的表格中有些条目在原始数据中并不存在,例如这里的第三行

>>> df_anon_pivoted.head()
d                                                   
c             1         2         3         4          5         6
a b                                                               
1 30   929.3453       NaN  875.3986       NaN   849.9972       NaN
  51   571.8364  508.9944  514.7396  593.0696   568.6159  598.0888
  51   173.5975       NaN  202.6101       NaN   190.2514       NaN
  51   741.7860  681.8020  697.6942  663.4423   748.3383  756.5396
  51  1131.7893       NaN  999.3353       NaN  1143.9245       NaN

173.5975 的值只出现在不同的 (a, b, c) 组合中:

>>> df_anon.query("d > 173.5974 and d < 173.5976")
a   b  c         d
2  30  1  173.5975

我到底错在哪里?

解决方案

这个问题出现在版本 2.3.3,我通过升级解决了它(3.0.3 起了作用,但也可能更早的版本也行)。

问题似乎在于为正确的输出数据设置了错误的索引,而且只有当输入规模足够大时才会出现。 的bug听起来与之相关。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章