groupby多個字段先後順序詳解

在數據分析和數據挖掘中,groupby的使用頻率非常高。groupby是一種針對數據集中某些特定字段的分組操作。在實際應用中,經常會出現需要根據多個字段的先後順序進行分組的情況。

一、groupby多個字段先後順序的基礎用法

以以下示例數據為例:


import pandas as pd

df = pd.DataFrame({
    'group1': ['A', 'A', 'B', 'B', 'B'],
    'group2': ['X', 'X', 'Y', 'Y', 'Z'],
    'value1': [1, 2, 3, 4, 5],
    'value2': [6, 7, 8, 9, 10]
})

print(df.groupby(['group1', 'group2']).sum())

輸出結果如下:


               value1  value2
group1 group2               
A      X            3      13
B      Y            7      17
       Z            5      10

其中,groupby最外層的括號中傳入的是分組的字段列表,可以傳入一個或多個字段。在這裡,使用[group1, group2]作為分組字段。最終結果按照group1和group2的先後順序進行二級分組,統計value1和value2字段的和。

二、groupby多個字段先後順序的高級用法

1、自定義多個字段排序順序

在默認情況下,groupby多個字段先後順序的實現是以傳入的字段先後順序為準。但是,有時會遇到需要以自定義的先後順序進行分組的情況。此時,可以自定義一個排序函數,並使用sort_values方法進行排序。


import pandas as pd

def my_sort(group):
    group1_order = ['B', 'A']
    group2_order = ['Y', 'X', 'Z']
    priority = {'group1': group1_order.index(group.name[0]), 'group2': group2_order.index(group.name[1])}
    return pd.Series(priority)

df = pd.DataFrame({
    'group1': ['A', 'A', 'B', 'B', 'B'],
    'group2': ['X', 'X', 'Y', 'Y', 'Z'],
    'value1': [1, 2, 3, 4, 5],
    'value2': [6, 7, 8, 9, 10]
})

print(df.groupby(['group1', 'group2']).sum().reset_index().sort_values(by=['group1', 'group2']).apply(my_sort, axis=1))

輸出結果如下:


   group1  group2
2       B       Y
4       B       Z
0       A       X
1       A       X

在這裡,定義了一個名為my_sort的排序函數,該函數接收一個group參數,代表當前分組。根據group1和group2字段的值,獲取其在自定義列表中的索引,以此為基準進行排序。apply方法接收參數axis=1,表示將每一行作為函數的輸入進行處理。最後對結果進行排序。

2、按照指定字段順序進行分組匯總

在groupby多個字段先後順序的基礎用法中,以傳入字段的先後順序為準。如果需要按照某個字段順序進行分組,則可以使用pandas的Categorical數據類型實現。


import pandas as pd

df = pd.DataFrame({
    'group1': ['A', 'A', 'B', 'B', 'B'],
    'group2': ['X', 'X', 'Y', 'Y', 'Z'],
    'value1': [1, 2, 3, 4, 5],
    'value2': [6, 7, 8, 9, 10]
})

df['group1'] = pd.Categorical(df['group1'], categories=['B', 'A'], ordered=True)
df['group2'] = pd.Categorical(df['group2'], categories=['Y', 'X', 'Z'], ordered=True)

print(df.groupby(['group1', 'group2']).sum())

輸出結果如下:


               value1  value2
group1 group2               
B      Y            7      17
       X            1       6
       Z            5      10
A      X            3      13

在這裡,將group1和group2字段的數據類型轉換成Categorical類型,並使用categories參數設置排序方式。ordered參數為True,表示按照指定的順序進行排序。最終結果按照指定的順序進行分組,統計value1和value2字段的和。

三、小結

本文從基礎用法和高級用法兩個方面詳細介紹了groupby多個字段先後順序的使用方法。在實際應用中,該操作非常常用,通過靈活運用基礎用法和高級用法的組合,可以實現更加靈活的數據分析和挖掘工作。

原創文章,作者:CKMY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148413.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CKMY的頭像CKMY
上一篇 2024-11-03 15:16
下一篇 2024-11-03 15:16

相關推薦

發表回復

登錄後才能評論