【问题标题】:Groupby into list for non consecutive valuesGroupby 进入非连续值的列表
【发布时间】:2021-01-28 08:53:40
【问题描述】:

我正在尝试按此数据集进行分组

    col1    col2
0   A   1
1   B   1
2   C   1
3   D   3
4   E   3
5   F   2
6   G   2
7   H   1
8   I   1
9   j   2
10  K   2

进入这个

1 : [A, B, C]
3: [D, E]
2: [ F; G]
1: [ H, I]
2: [ J,K]

所以它必须捕捉元素外观的差异,而不是一次全部分组。

到目前为止,我能够进行正常的 groupby,df.groupby("col2")["col1"].apply(list),但它不正确。

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    您需要通过比较不等于累积和的移位值来区分连续值,最后删除MultiIndex的第二级:

    s = (df.groupby(["col2", df["col2"].ne(df["col2"].shift()).cumsum()])["col1"]
           .agg(list)
           .reset_index(level=1, drop=True))
    

    【讨论】:

    • aggapply 之间的性能差异?
    • @SayandipDutta - 不容易的问题,我猜agg 应该更快,因为apply 更通用。
    • @SayanipDutta - 如果想要将["col1"] 更改为["col1", "col3", 'colN'],这里应该更好地使用agg 作为一般解决方案
    • @ombk 是的,使用.groupby(["col2", df["col2"].ne(df["col2"].shift()).cumsum()], sort=False)["col1"] 代替.groupby(["col2", df["col2"].ne(df["col2"].shift()).cumsum()])["col1"]
    • @Pygirl - 应该更快,如果大数据可能 pandas 获胜,也许是真实数据中最好的测试
    【解决方案2】:

    因为 Jezrael 已经回答是使用 pandas。我想添加非熊猫方法。

    我知道这不是一种有效的方法,但出于学习目的,我包括在内。

    使用itertools's groupby

    from itertools import groupby
    last_index = 0
    for v, g in groupby(enumerate(df.col2), lambda k: k[1]):
        l = [*g]
        print(df.iloc[last_index]['col2'],':', df.iloc[last_index:l[-1][0]+1]['col1'].values)
        last_index += len(l)
    

    1 : ['A' 'B' 'C']
    3 : ['D' 'E']
    2 : ['F' 'G']
    1 : ['H' 'I']
    2 : ['j' 'K']
    

    【讨论】:

    • 它将保持它们出现的顺序。
    猜你喜欢
    • 2011-06-29
    • 2016-02-20
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多