一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

各項(xiàng)工具大pk,分組聚合哪家強(qiáng)?

 小小明代碼實(shí)體 2021-11-30

作者簡(jiǎn)介:小小明,Pandas數(shù)據(jù)處理專家,致力于幫助無(wú)數(shù)數(shù)據(jù)從業(yè)者解決數(shù)據(jù)處理難題。

大家好,我是小小明。

先看一個(gè)小需求:

image-20210108114445092

今天呢,我將帶大家分別使用MySQL、Excel、Pandas、VBA和Python來(lái)實(shí)現(xiàn)這個(gè)需求,讓大家對(duì)分組統(tǒng)計(jì)代碼層面的實(shí)現(xiàn)能夠更加熟悉。

文章目錄

MySQL實(shí)現(xiàn)分組統(tǒng)計(jì)

sql語(yǔ)句:

SELECT 
  deal_date,
  SUM(IF(AREA= 'A區(qū)', 1, 0)) 'A區(qū)',
  SUM(IF(AREA= 'B區(qū)', 1, 0)) 'B區(qū)',
  SUM(IF(AREA= 'C區(qū)', 1, 0)) 'C區(qū)' 
FROM
  order_info 
GROUP BY deal_date ;

結(jié)果:

img

Excel實(shí)現(xiàn)分組統(tǒng)計(jì)

首先創(chuàng)建數(shù)據(jù)透視表:

image-20210108153149210

然后將對(duì)應(yīng)的字段拖動(dòng)到正確的位置:

image-20210108153328511

然后打開(kāi)透視表選項(xiàng)取消這兩項(xiàng)勾選即可:

image-20210108153830684

Pandas進(jìn)行分組統(tǒng)計(jì)

讀取數(shù)據(jù):

import pandas as pd

df = pd.read_csv("data.csv", encoding="gb18030")
df

結(jié)果:

order_idpricedeal_datearea
0S001102019/1/1A區(qū)
1S002202019/1/1B區(qū)
2S003302019/1/1C區(qū)
3S004402019/1/2A區(qū)
4S005102019/1/2B區(qū)
5S006202019/1/2C區(qū)
6S007302019/1/3A區(qū)
7S008402019/1/3C區(qū)

使用數(shù)據(jù)透視表操作:

df.pivot_table(values="order_id", index="deal_date",
               columns="area", aggfunc="count", fill_value=0)

上述代碼相當(dāng)于groupby操作:

df.groupby(["deal_date", "area"])["order_id"].count().unstack(1, fill_value=0)

但我一般會(huì)這樣寫:

df.groupby(["deal_date", "area"]).size().unstack(1, fill_value=0)

結(jié)果均為:

image-20210108155215789

VBA實(shí)現(xiàn)分組統(tǒng)計(jì)

經(jīng)過(guò)近1小時(shí)的痛苦的嘗試,終于編寫出了下面這段VBA代碼,它模擬實(shí)現(xiàn)了分組計(jì)數(shù)的過(guò)程:

Option Explicit
Function is_exists(name As String)
Dim sht As Worksheet
For Each sht In Worksheets
   If sht.name = name Then
      is_exists = True
      Exit Function
   End If
Next
is_exists = False
End Function

Sub 分組統(tǒng)計(jì)()
    Dim LastRow, LastCol As Long
    Dim Sh As Worksheet
    'Sh指代當(dāng)前活動(dòng)頁(yè)
    Set Sh = Sheets("data")
    '當(dāng)前活動(dòng)頁(yè)的最后一行
    LastRow = Sh.Cells(Rows.Count, 1).End(xlUp).row
    '當(dāng)前活動(dòng)頁(yè)的最后一列
    LastCol = Sh.Cells(1, Columns.Count).End(xlToLeft).Column
    '定義D為字典
    Dim D As Object
    Set D = CreateObject("Scripting.Dictionary")
    Dim row, i As Integer
    Dim key, value As String
    
    For i = 2 To LastRow
        key = Sh.Cells(i, 3).value
        value = Sh.Cells(i, 4).value
        '如果在字典里
        If Not D.exists(key) Then
            D.Add key, Array(0, 0, 0)
        End If
        row = D(key)
        If value = "A區(qū)" Then
            row(0) = row(0) + 1
        ElseIf value = "B區(qū)" Then
            row(1) = row(1) + 1
        ElseIf value = "C區(qū)" Then
            row(2) = row(2) + 1
        End If
        D(key) = row
    Next
    '調(diào)試輸出字典存儲(chǔ)的內(nèi)容
    For Each key In D.keys()
        Debug.Print key & "," & Join(D(key), ",")
    Next
    
    Dim sht As Worksheet
    If is_exists("result") Then
        Sheets("result").Delete
    End If
    
    '在最后的位置增加一個(gè)sheet作為結(jié)果表
    Sheets.Add After:=Sheets(Sheets.Count)
    Set sht = Sheets(Sheets.Count)
    sht.name = "result"
    
    '屏幕刷新=false
    Application.ScreenUpdating = False
    '下面寫出數(shù)據(jù)到結(jié)果表中,首先寫出標(biāo)題行
    sht.Range("A1").Resize(1, 4) = Application.Transpose(Array("deal_date", "A區(qū)", "B區(qū)", "C區(qū)"))
    sht.Range("A2").Resize(D.Count, 1) = Application.Transpose(D.keys)
    i = 2
    For Each row In D.items()
        sht.Cells(i, 2).Resize(1, 3) = row
        i = i + 1
    Next
    Application.ScreenUpdating = True
    
End Sub

運(yùn)行前:

image-20210108184222067

點(diǎn)擊按鈕運(yùn)行后:

image-20210108185008129

立即窗口和工作表都看到了正確的結(jié)果輸出,立即窗口看到重復(fù)2次的輸出是因?yàn)槲疫B續(xù)運(yùn)行了兩次。

Python實(shí)現(xiàn)分組計(jì)數(shù)

實(shí)現(xiàn)代碼:

import csv
from collections import namedtuple

result = {}
columns = ["A區(qū)", "B區(qū)", "C區(qū)"]
areas_map = dict(zip(columns, range(len(columns))))
with open("data.csv", encoding="gb18030") as f:
    f_csv = csv.reader(f)
    headers = next(f_csv)
    resultSet = namedtuple("resultSet", headers)
    for r in f_csv:
        row = resultSet(*r)
        areas = result.setdefault(row.deal_date, [0, 0, 0])
        areas[areas_map[row.area]] += 1
result

結(jié)果:

{'2019/1/1': [1, 1, 1], '2019/1/2': [1, 1, 1], '2019/1/3': [1, 0, 1]}

借助Pandas轉(zhuǎn)換為表結(jié)構(gòu)方便查看:

pd.DataFrame.from_dict(result, 'index', columns=["A區(qū)", "B區(qū)", "C區(qū)"])

結(jié)果:

A區(qū)B區(qū)C區(qū)
2019/1/1111
2019/1/2111
2019/1/3101

下面用Python模擬一下Pandas數(shù)據(jù)透視表實(shí)現(xiàn)分組統(tǒng)計(jì)的過(guò)程:

import csv
from collections import namedtuple, Counter

result = Counter()
with open("data.csv", encoding="gb18030") as f:
    f_csv = csv.reader(f)
    headers = next(f_csv)
    resultSet = namedtuple("resultSet", headers)
    for r in f_csv:
        row = resultSet(*r)
        result[(row.deal_date, row.area)] += 1
result

結(jié)果:

Counter({('2019/1/1', 'A區(qū)'): 1,
         ('2019/1/1', 'B區(qū)'): 1,
         ('2019/1/1', 'C區(qū)'): 1,
         ('2019/1/2', 'A區(qū)'): 1,
         ('2019/1/2', 'B區(qū)'): 1,
         ('2019/1/2', 'C區(qū)'): 1,
         ('2019/1/3', 'A區(qū)'): 1,
         ('2019/1/3', 'C區(qū)'): 1})

第二步Pandas還需再對(duì)這個(gè)結(jié)果進(jìn)行重塑才得到最終所需要的結(jié)果,具體重塑的過(guò)程實(shí)際實(shí)現(xiàn)較為復(fù)雜,但可以借助category的Series模擬實(shí)現(xiàn)一下:

indexs = result.keys()
index = pd.Series(map(lambda x: x[0], indexs), dtype='category')
columns = pd.Series(map(lambda x: x[1], indexs), dtype='category')
values = result.values()

data = np.zeros((len(index.cat.categories), len(columns.cat.categories)))
for x, y, v in zip(index.cat.codes, columns.cat.codes, values):
    data[x, y] = v
result = pd.DataFrame(data, index=index.cat.categories,
                      columns=columns.cat.categories, dtype='int8')
result

結(jié)果:

A區(qū)B區(qū)C區(qū)
2019/1/1111
2019/1/2111
2019/1/3101

總結(jié)

其實(shí)不管用什么語(yǔ)言和工具,分組聚合統(tǒng)計(jì)的核心原理都是:

image-20210108205838173

今天我給大家同時(shí)演示了MySQL、Excel、Pandas、VBA和Python實(shí)現(xiàn)分組聚合,通過(guò)對(duì)比,或許讀者能自己總結(jié)出各項(xiàng)工具的優(yōu)劣和適用場(chǎng)景,歡迎你在下方評(píng)論區(qū)留言或評(píng)論,發(fā)表你的看法,給大家分享和互動(dòng)。

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    日本午夜精品视频在线观看| 国产在线一区中文字幕| 九九热在线视频观看最新| 日韩和欧美的一区二区三区| 99久久精品视频一区二区| 日韩成人动作片在线观看| 在线免费国产一区二区三区| 国内外激情免费在线视频| 亚洲精品成人综合色在线| 麻豆蜜桃星空传媒在线观看| 久久中文字幕中文字幕中文| 国产又粗又长又爽又猛的视频| 一区二区三区国产日韩| 国产精品午夜视频免费观看| 国产精品免费无遮挡不卡视频| 欧洲一级片一区二区三区| 亚洲精品国产美女久久久99| 五月天丁香婷婷狠狠爱| 91超频在线视频中文字幕| 日本中文字幕在线精品| 国产精品夜色一区二区三区不卡| 国产精品一区日韩欧美| 亚洲精品国产主播一区| 亚洲中文字幕视频在线播放| 日韩亚洲精品国产第二页| 99热中文字幕在线精品| 亚洲精品偷拍一区二区三区| 欧美日韩视频中文字幕| 成人精品网一区二区三区| 91精品视频全国免费| 午夜精品一区二区av| 欧美一区二区三区在线播放| 午夜免费精品视频在线看| 欧美中文字幕日韩精品| 九九九热视频免费观看| 国产一区日韩二区欧美| 经典欧美熟女激情综合网| 夫妻性生活动态图视频| 亚洲国产色婷婷久久精品| 日韩国产中文在线视频| 日本高清视频在线播放|