簡體   English   中英

Groupby 進入非連續值的列表

[英]Groupby into list for non consecutive values

我正在嘗試按此數據集進行分組

    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)但它不正確。

您需要通過比較不等於累積和的移位值來區分連續值,最后刪除MultiIndex的第二級:

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

由於 Jezrael 已經回答是使用 pandas。 我想添加非 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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM