【问题标题】:error reindex from a duplicate axis in groupby错误从 groupby 中的重复轴重新索引
【发布时间】:2020-10-09 21:18:14
【问题描述】:

by = "B" 块在 case1 和 case2 中都有重复的索引,

为什么 case1 有效,而 case2 无效。

案例1

df1 = pd.DataFrame({"a":[0,100,200],  "by":["A","B","B"]}, index=[0,1,1])
df1.groupby("by").diff()  
# result is okay

案例2

df2 = pd.DataFrame({"a":[0,100,200],  "by":["C","B","B"]}, index=[0,1,1])
df2.groupby("by").diff()  
# throws ValueError: cannot reindex from a duplicate axis

【问题讨论】:

  • bug 可能吗?
  • 如果你通过sort=False 它工作正常。这让我想到了第一个 df,groupby 按字母顺序排序,索引是 0 后跟 1 - 不知何故,程序不会将其视为重复项。然而,第二个df,它分组,按字母顺序排序,但B在C之前。程序看到两个1,两个B并触发错误。如果你设置sort=False它以C开头,索引从0开始,程序看不到欺骗,一切都很好。为什么?不知道。只是思考错误的可能原因。不过我建议你提出问题。
  • 此错误已在 v.1.1.0 中修复。它在v.1.1.0 中运行良好,在v.1.0.3 中引发错误
  • 我最近向 pandas 做了一个 PR,所以我有 pandas 大师 v1.1.0 并在 v.1.1.0 中运行它们都运行良好并给出了预期的结果。我找不到与上述问题相关的 PR 或问题,一旦找到,我会在此处留下链接。
  • @sammywemmy 是的,v1.1.0 会好很多。检查whats new in 1.1.0 和 groupby/resample/rolling 下的第一个错误修复是问题中问题的修复。

标签: python pandas pandas-groupby


【解决方案1】:

当存在重复索引时,Pandas 将不知道如何执行。在这种情况下,我们告诉他们的一种方法是重置索引:

df2 = pd.DataFrame({"a":[0,100,200],  "by":["C","B","B"]}, index=[0,1,1])
df2.reset_index(drop=True).groupby("by").diff() 

结果:

     a
0   NaN
1   NaN
2   100.0

只有当您确定您的系列按位置对齐时,您才能在每个数据帧上调用 reset_index。

【讨论】:

    【解决方案2】:

    关闭 groupby 的 sort 属性即可解决您的问题。

    df1 = pd.DataFrame({"a":[0,100,200],  "by":["C","B","B"]}, index=[0,1,1])
    df1.groupby("by", sort=False).diff()
    print(df1)
    

    结果:

         a by
    0    0  C
    1  100  B
    1  200  B
    

    说明:

    即使您“无法从重复轴重新索引”,Pandas 也会尝试通过在激活排序属性时按字母顺序为字母分配排名来做到这一点,例如:

    A ---> 1

    B ---> 2

    B ---> 3

    即使我们有 2 个 B,考虑到第二个 B 在逻辑上出现在第一个 B 之后,增量也是可能的。 例如,下面的代码块完美运行:

    import pandas as pd
    
    # THE CODE BELOW WORKS PERFECTLY
    df1 = pd.DataFrame({"a":[0,100,90],  "by":["A","B","B"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    
    df1 = pd.DataFrame({"a":[0,100,90],  "by":["B","C","C"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    
    df1 = pd.DataFrame({"a":[0,100,90],  "by":["C","D","D"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    

    因为 D 在 C 之后,C 在 B 之后,依此类推... 熊猫试图找到一个逻辑

    考虑到字母顺序,这是不合逻辑的: DCC ---> 您不能将 1 分配给 D,因此将 2 分配给 C。

    下面的代码块会产生错误:

    # EVERY CHUNK OF CODE BELOW GENERATES AN ERROR
    df1 = pd.DataFrame({"a":[0,100,90],  "by":["B","A","A"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    # builtins.ValueError: cannot reindex from a duplicate axis
    
    df1 = pd.DataFrame({"a":[0,100,90],  "by":["D","C","C"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    # builtins.ValueError: cannot reindex from a duplicate axis
    
    df1 = pd.DataFrame({"a":[0,100,90],  "by":["E","D","D"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    # builtins.ValueError: cannot reindex from a duplicate axis
    

    更进一步: 让我们考虑这两个块及其结果:

    df1 = pd.DataFrame({"a":[0,100,200],  "by":["E","D","F"]}, index=[0,1,1])
    df1.groupby("by").diff()
    print(df1)
    # builtins.ValueError: cannot reindex from a duplicate axis
    

    仅对索引进行更改...

    df1 = pd.DataFrame({"a":[0,100,200],  "by":["E","D","F"]}, index=[0,1,2])
    df1.groupby("by").diff()
    print(df1)
    
    #      a by
    # 0    0  E
    # 1  100  D
    # 2  200  F
    

    即使 EDF 不是字母顺序,Pandas 似乎也通过使用索引来进行排序逻辑...... 在第一种情况下,索引为 011,没有排序逻辑 012 不是这样的

    总之,您必须通过将其设置为 False 属性来停用排序,以防止 Pandas 排序尝试

    【讨论】:

      【解决方案3】:

      我假设 .diff() 处理排序的数据。你可以试试这个:

      df2 = pd.DataFrame({"a":[0,100,200],  "by":["C","B","B"]}, index=[0,1,1])
      df2.sort_values(by='by').groupby("by").diff()
      

      【讨论】:

        猜你喜欢
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 2015-02-26
        • 2016-05-17
        • 1970-01-01
        • 1970-01-01
        • 2020-05-23
        相关资源
        最近更新 更多