簡體   English   中英

優化 groupby agg function 以返回多個結果列

[英]Optimizing a groupby agg function to return multiple result columns

我有這個 dataframe;

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Client':np.random.choice(['Customer_A', 'Customer_B'], 1000),
    'Product':np.random.choice( ['Guns', 'Ammo', 'Armour'], 1000),
    'Value':(np.random.randn(1000))
})
Categoricals = ['Client', 'Product']
df[Categoricals] = df[Categoricals].astype('category')
df = df.drop_duplicates()
df

我想要這個結果;

# Non-anonymous function for Anomaly limit
def Anomaly (x):
    Q3 = np.nanpercentile(x, q = 75)
    Q1 = np.nanpercentile(x, q = 25)
    IQR = (Q3 - Q1)
    return (Q3 + (IQR * 2.0))

# Non-anonymous function for CriticalAnomaly limit
def CriticalAnomaly (x):
    Q3 = np.nanpercentile(x, q = 75)
    Q1 = np.nanpercentile(x, q = 25)
    IQR = (Q3 - Q1)
    return (Q3 + (IQR * 3.0))


# Define metrics
Metrics = {'Value':['count', Anomaly, CriticalAnomaly]}

# Groupby has more than 1 grouping column, so agg can only accept non-anonymous functions
Limits = df.groupby(['Client', 'Product']).agg(Metrics)
Limits

但在大型數據集上速度很慢,因為函數“Anomaly”和“CriticalAnomaly”必須重新計算 Q1、Q3 和 IQR 兩次,而不是一次。 通過將這兩個功能結合在一起,它會變得更快。 但結果是 output 進入 1 列而不是 2 列。

# Combined anomaly functions
def CombinedAnom (x):
    Q3 = np.nanpercentile(x, q = 75)
    Q1 = np.nanpercentile(x, q = 25)
    IQR = (Q3 - Q1)
    Anomaly = (Q3 + (IQR * 2.0))
    CriticalAnomaly = (Q3 + (IQR * 3.0))
    return (Anomaly, CriticalAnomaly)

# Define metrics
Metrics = {'Value':['count', CombinedAnom]}

# Groupby has more than 1 grouping column, so agg can only accept non-anonymous functions
Limits = df.groupby(['Client', 'Product']).agg(Metrics)
Limits

如何將 function 組合成兩列?

如果您使用apply而不是agg ,您可以返回一個解壓到列中的Series

def f(g):
    return pd.Series({
        'c1': np.sum(g.b),
        'c2': np.prod(g.b)
    })

df = pd.DataFrame({'a': list('aabbcc'), 'b': [1,2,3,4,5,6]})
df.groupby('a').apply(f)

這來自:

   a  b
0  a  1
1  a  2
2  b  3
3  b  4
4  c  5
5  c  6

   c1  c2
a        
a   3   2
b   7  12
c  11  30

暫無
暫無

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

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