代码之家  ›  专栏  ›  技术社区  ›  jssm

大熊猫数列上的部分和

  •  3
  • jssm  · 技术社区  · 7 年前

    我有一个 DataFrame 看起来像

           A      B
    0     1.2     1
    1     1.2     6
    2     1.2     4
    3     2.3     2
    4     2.3     5
    5     1.2     7
    

    我想为一个拥有相同价值的 A 但前提是它们彼此相邻。对于这个案子,我期待着另一个 数据帧 如在

    0    1.2    11
    3    2.3    7
    5    1.2    7
    

    我觉得我可以用 .groupby 但我只能在不考虑 彼此相邻。

    2 回复  |  直到 7 年前
        1
  •  6
  •   jezrael    7 年前

    使用 groupby 由助手 Series 含集料 first sum :

    df = df.groupby(df.A.ne(df.A.shift()).cumsum(), as_index=False).agg({'A':'first','B':'sum'})
    print (df)
         A   B
    0  1.2  11
    1  2.3   7
    2  1.2   7
    

    细节 :

    比较 shift D列 ne ( != )并添加 cumsum 对于连续组 系列 :

    print (df.A.ne(df.A.shift()).cumsum())
    0    1
    1    1
    2    1
    3    2
    4    2
    5    3
    Name: A, dtype: int32
    

    感谢@user2285236发表评论:

    当数据类型为float时,检查是否相等可能会导致不需要的结果。在这里,isclose可能是更好的选择。

    df = df.groupby(np.cumsum(~np.isclose(df.A, df.A.shift())), as_index=False).agg({'A':'first','B':'sum'})
    print (df)
         A   B
    0  1.2  11
    1  2.3   7
    2  1.2   7
    
    print (np.cumsum(~np.isclose(df.A, df.A.shift())))
    [1 1 1 2 2 3]
    
        2
  •  2
  •   piRSquared    7 年前

    itertools.groupby

    遭受同样的问题 @user2285236

    g = groupby(df.itertuples(index=False), key=lambda x: x.A)
    pd.DataFrame(
        [[a, sum(t.B for t in b)] for a, b in g],
        columns=df.columns
    )
    
         A   B
    0  1.2  11
    1  2.3   7
    2  1.2   7