一、groupby函數的基本介紹
Python中的groupby函數可以將相鄰的元素按照指定的key值分組,返回一個分組完成後的迭代器。該函數可用於對數據進行分組分析,統計,排序等操作。 本文將圍繞著groupby函數展開,詳細介紹其用法和實現。
from itertools import groupby
data = [1, 1, 2, 3, 3, 3]
grouped = groupby(data)
for k, g in grouped:
print(k, list(g))
上述代碼將列表[1, 1, 2, 3, 3, 3]按照元素相鄰的方式分組,輸出結果如下:
1 [1, 1]
2 [2]
3 [3, 3, 3]
二、groupby函數的常見應用場景
groupby函數常用於數據處理和分析。
1. 數據分組和統計計算
groupby函數可以將一組數據按照指定的標準進行分組,然後針對每個分組進行統計計算,得到不同分組的統計結果。
import pandas as pd
data = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [9,10,11,12,13,14,15,16]})
for name, group in data.groupby('A'):
print(name)
print(group)
上述代碼將DataFrame對象根據『A』列的取值進行分組,輸出每個分組的名稱及其內容。
2. 數據去重
相同的元素在被分組後會被統一歸為一組,通過groupby函數可以實現對某個列表中相同元素的去重處理。
a = [1, 3, 2, 1, 2, 3, 12, 11, 12]
b = list(set(a))
print(b)
c = [key for key, group in groupby(a)]
print(c)
上述代碼輸出結果為 [1,2,3,11,12],這裡的c變數是groupby函數去重後的結果。
三、groupby相關函數詳解
1. groupby函數
groupby(iterable[,key]) 根據iterable中元素的key進行分組
2. itertools.groupby(iterable[, key][,func])
功能與groupby函數基本一致,可以在原來基礎上添加func參數,該參數用於進行元素的函數映射。
3. sorted(iterable[,key])
該函數類似於groupby函數,不同之處在於sorted函數是將整個可迭代對象進行排序,而groupby函數只是針對相鄰的元素進行分組,返回一個迭代器對象。
4. defaultdict(list)
在進行字典分組的時候,如果某個key沒有對應的value,會報錯。使用defaultdict可以解決這個問題。默認情況下defaultdict創建的字典的value是一個空的list。
from collections import defaultdict
d = defaultdict(list)
for key, value in data_list:
d[key].append(value)
上述代碼將元素按照key值分組,在字典中創建空列表作為value,然後將相同key的value添加到該列表中。
四、groupby的實現原理及優化方式
1. 實現原理
groupby函數的實現原理可以通過Itertools模塊中的groupby函數源代碼進行解讀。
# groupby('AAAABBBCCDAABBB') --> A B C D A B
# groupby([1,2,1,2,3,1,2]) --> 1, 2, 1, 2, 3, 1, 2
def groupby(iterable, key=None):
# groupby('AABBCD') -> A-A B-B C-C D-D
# groupby('AaaBBbcCAAa', str.lower) -> A-a A-a A-a B-b b-C C-A A-a
for k, g in groupby_impl(iterable, key):
yield k, list(g)
def groupby_impl(iterable, key=None):
# groupby('AABBCD') -> A-A B-B C-C D-D
# groupby('AaaBBbcCAAa', str.lower) -> A-a A-a A-a B-b b-C C-A A-a
it = iter(iterable)
if key is None:
key = lambda x: x
sentinel = object()
prev_key = sentinel
prev_value = []
for value in it:
cur_key = key(value)
if cur_key != prev_key:
yield prev_key, (x for x in prev_value)
prev_key = cur_key
prev_value = [value]
else:
prev_value.append(value)
yield prev_key, (x for x in prev_value)
通過源代碼,可以發現groupby函數的實現原理:利用迭代器遍歷輸入的可迭代對象,通過定義的key函數將元素進行分組。
2. 優化方式
為了提高groupby函數的執行效率,可以採用以下優化方式:
① 對元素進行排序
在進行groupby函數分組之前,可以對元素進行排序操作,使得相同的元素可以更快地被分組。
# 數據進行排序
data.sort(key=lambda x: x[0])
groups = []
uniquekeys = []
for k, g in groupby(data, lambda x: x[0]):
groups.append(list(g))
uniquekeys.append(k)
# 排序後輸出結果
print(groups)
print(uniquekeys)
② 利用集合去重
如果只需要去重和計數,可以使用集合替代groupby函數,它可以更快地完成去重和計數操作。
a = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
b = set(a)
for i in b:
print(i, '出現次數:', a.count(i))
五、總結
本文詳細介紹了Python中的groupby函數的用法和實現方式,包括groupby函數的常見應用場景、相關函數等內容,同時還介紹了groupby函數的實現原理及優化方式。在數據處理和分析中,掌握這個函數可以極大地提高數據的處理效率和準確度。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/302819.html