【问题标题】:Pandas groupby sequential valuesPandas 按顺序值分组
【发布时间】:2019-04-05 02:10:57
【问题描述】:

我不知道如何调用这个操作,所以我真的无法用谷歌搜索任何东西,但这是我想要做的:

我有这个数据框:

df = pd.DataFrame({"name": ["A", "B", "B", "B", "A", "A", "B"], "value":[3, 1, 2, 0, 5, 2, 3]})
df
  name  value
0    A      3
1    B      1
2    B      2
3    B      0
4    A      5
5    A      2
6    B      3

我想将它分组到 df.name 并在 df.values 上应用 max 函数,但前提是名称是按顺序排列的。所以我想要的结果如下:

df.groupby_sequence("name")["value"].agg(max)
  name  value
0    A      3
1    B      2
2    A      5
3    B      3

任何线索如何做到这一点?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    不完全是 pandas 解决方案,但您可以使用来自 itertools 的 groupby:

    from operator import itemgetter
    
    import pandas as pd
    from itertools import groupby
    
    df = pd.DataFrame({"name": ["A", "B", "B", "B", "A", "A", "B"], "value":[3, 1, 2, 0, 5, 2, 3]})
    
    result = [max(group, key=itemgetter(1)) for k, group in groupby(zip(df.name, df.value), key=itemgetter(0))]
    
    print(result)
    

    输出

    [('A', 3), ('B', 2), ('A', 5), ('B', 3)]
    

    【讨论】:

      【解决方案2】:

      使用pandas,您可以在名称逐行更改时进行分组,使用(df.name!=df.name.shift()).cumsum(),基本上将连续的名称组合在一起:

      >>> df.groupby((df.name!=df.name.shift()).cumsum()).max().reset_index(drop=True)
        name  value
      0    A      3
      1    B      2
      2    A      5
      3    B      3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-20
        • 2021-10-31
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多