簡體   English   中英

Itertools groupby使用另一個列表對列表進行分組

[英]Itertools groupby to group list using another list

在熊貓中,您可以使用長度相等的Series來將GroupBy另一個GroupBy一起使用,例如:

s = pd.Series([1,1,1,-2,-4,-3,1,2])
g = np.sign(s).diff().fillna(0).abs().cumsum()
s.groupby(g).count()

0.0    3
2.0    3
4.0    2
dtype: int64

是否可以使用itertools.groupby做同樣的事情? 因此,使用另一個列表從當前列表創建組嗎? 還是使用一些密鑰? 只要能使我想到如何解決這種情況[1,1,1,-2,-4,-3,1,2]以根據唱歌創建組就很好了。

預期產量:

[3,3,2]

您可以執行以下操作:

from itertools import groupby


data =  [1,1,1,-2,-4,-3,1,2]

result = [sum(1 for _ in group) for _, group in groupby(data, lambda x: x<= 0)]
print(result)

產量

[3, 3, 2]

語句: sum(1 for _ in group)計算sum(1 for _ in group)中元素的數量。 密鑰lambda x: x<= 0符號函數。

對於根據匹配值將一個可迭代項分組為另一個可迭代項的一般情況,您可以使一個作弊key函數迭代另一個可迭代項,例如使用原始sg

>>> from itertools import groupby
>>> print([(k, len(list(grp))) for k, grp in groupby(s, key=lambda _, ig=iter(g): next(ig))])
[(0.0, 3), (2.0, 3), (4.0, 2)]

key函數從s接受值並忽略它,而不是從手動迭代g返回匹配值(默認的第二個參數緩存從g創建的迭代器,然后每次使用next手動將其前進;將第二個參數傳遞給next以靜默忽略不匹配的長度,而只是替換為默認值)。

顯然,對於這種特定情況,有更好的方法 ,但是我在回答所問的一般問題,而不是特定示例。

暫無
暫無

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

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