스택큐힙리스트

여러 그룹화 열에 여러 함수를 적용합니다. 본문

카테고리 없음

여러 그룹화 열에 여러 함수를 적용합니다.

스택큐힙리스트 2023. 4. 15. 13:38
반응형

$#^*$!$^$&은 딕셔너리를 사용하여 그룹화된 객체에 여러 함수를 동시에 적용하는 방법을 출력 열 이름을 키로 사용하여 보여줍니다:

In [563]: grouped['D'].agg({'result1' : np.sum,

.....: 'result2' : np.mean})

.....:

Out[563]:

result2 result1

A

bar -0.579846 -1.739537

foo -0.280588 -1.402938

하지만 이것은 Series groupby 객체에서만 작동합니다. 그리고 그룹화된 DataFrame에 dict가 전달될 때, 함수가 적용될 열 이름이 키로 있어야합니다.

내가 하고 싶은 것은 여러 열에 여러 함수를 적용하는 것입니다 (하지만 일부 열은 여러 번 처리될 것입니다). 또한 일부 함수는 groupby 객체의 다른 열에 따라 달라집니다 (예: sumif 함수). 내 현재 솔루션은 열마다 이동하면서 위의 코드와 같은 것을하는 것입니다. 다른 행에 따라 함수를 사용하는 람다를 사용합니다. 그러나 이것은 오랜 시간이 걸립니다 (나는 groupby 객체를 반복하는 데 오랜 시간이 걸린다고 생각합니다). 전체 groupby 객체를 한 번에 순환하도록 변경해야하지만 Pandas에서이를 깨끗하게 수행하는 내장 방법이있는지 궁금합니다.

예를 들어, 나는 이런 식으로 시도해 봤습니다.

grouped.agg({'C_sum' : lambda x: x['C'].sum(),

'C_std': lambda x: x['C'].std(),

'D_sum' : lambda x: x['D'].sum()},

'D_sumifC3': lambda x: x['D'][x['C'] == 3].sum(), ...)

하지만 예상대로 KeyError가 발생합니다 (DataFrame에서 agg가 호출되므로 키는 열이어야 합니다).

제가 하고 싶은 작업을 수행하는 내장된 방법이 있을까요? 또는 이러한 기능이 추가될 가능성이 있을까요? 아니면 그룹별로 수동으로 반복해야 할까요?

답변 1

현재 허용되는 답변의 두 번째 절반은 구식이며 두 가지 사용 중지 사항이 있습니다. 첫째로 가장 중요한 것으로, 지금은 사전 안의 사전을 groupby 메소드에 전달할 수 없습니다. 둘째로, 결코 .ix를 사용하지 마십시오.

동시에 두 개의 별개의 열을 작업하려면 적용된 함수에 자동으로 DataFrame이 전달되는 apply 방법을 사용하는 것이 좋습니다. 위와 유사한 데이터 프레임을 사용해 봅시다.

df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))

df['group'] = [0, 0, 1, 1]

df

a b c d group

0 0.418500 0.030955 0.874869 0.145641 0

1 0.446069 0.901153 0.095052 0.487040 0

2 0.843026 0.936169 0.926090 0.041722 1

3 0.635846 0.439175 0.828787 0.714123 1

열 이름에서 집계 함수로 매핑된 사전은 여전히 집계를 수행하기에 완벽한 방법입니다.

df.groupby('group').agg({'a':['sum', 'max'],

'b':'mean',

'c':'sum',

'd': lambda x: x.max() - x.min()})

a b c d

sum max mean sum

group

0 0.864569 0.446069 0.466054 0.969921 0.341399

1 1.478872 0.843026 0.687672 1.754877 0.672401

그 추한 람다 열 이름이 마음에 들지 않는다면, 일반 함수를 사용하고 이렇게 특별 __name__ 속성에 사용자 정의 이름을 제공할 수 있습니다.

def max_min(x):

return x.max() - x.min()

max_min.__name__ = 'Max minus Min'

df.groupby('group').agg({'a':['sum', 'max'],

'b':'mean',

'c':'sum',

'd': max_min})

a b c d

sum max mean sum Max minus Min

group

0 0.864569 0.446069 0.466054 0.969921 0.341399

1 1.478872 0.843026 0.687672 1.754877 0.672401

$#^&!#$*$&을 사용하여 시리즈를 반환합니다.

이제, 상호작용이 필요한 여러 열이있는 경우 집계 함수로 암시 적으로 Series를 전달하는 agg를 사용할 수 없습니다. apply을 사용하면 전체 그룹이 DataFrame으로 함수에 전달됩니다.

나는 모든 집계를 포함하는 Series를 반환하는 단일 사용자 정의 함수를 만드는 것을 추천한다. 새로운 열의 라벨로 Series 인덱스를 사용하라.

def f(x):

d = {}

d['a_sum'] = x['a'].sum()

d['a_max'] = x['a'].max()

d['b_mean'] = x['b'].mean()

d['c_d_prodsum'] = (x['c'] * x['d']).sum()

return pd.Series(d, index=['a_sum', 'a_max', 'b_mean', 'c_d_prodsum'])

df.groupby('group').apply(f)

a_sum a_max b_mean c_d_prodsum

group

0 0.864569 0.446069 0.466054 0.173711

1 1.478872 0.843026 0.687672 0.630494

당신이 MultiIndexes를 좋아하더라도, 이렇게 하면 여전히 하나의 Series를 반환할 수 있습니다.

def f_mi(x):

d = []

d.append(x['a'].sum())

d.append(x['a'].max())

d.append(x['b'].mean())

d.append((x['c'] * x['d']).sum())

return pd.Series(d, index=[['a', 'a', 'b', 'c_d'],

['sum', 'max', 'mean', 'prodsum']])

df.groupby('group').apply(f_mi)

a b c_d

sum max mean prodsum

group

0 0.864569 0.446069 0.466054 0.173711

1 1.478872 0.843026 0.687672 0.630494

답변 2

다중 함수를 다중 그룹by 열에 적용

판다 PD.DataFrame.groupby() 메소드는 데이터 프레임을 그룹화할 수 있습니다. 이 그룹은 사용자 지정 함수를 적용할 수 있습니다. 그룹화는 열별로 구분될 수 있으며, 그룹화 결과를 다중 함수로 조작할 수 있습니다. 여러 열에 다른 함수를 적용하는 것은 통계 분석에 매우 적합합니다.

다중 함수를 다중 그룹by 열에 적용하려면 apply() 메서드를 사용합니다. 이 메서드는 각 열별로 다른 함수를 적용할 수 있습니다. 예를 들어, 그룹화된 데이터의 최댓값, 최솟값, 평균 등의 값을 다른 열에 적용할 수 있습니다. 이를 통해 더 나은 분류 결과를 생성하고 추가적인 분석 기능을 가능하게 합니다.

그룹by를 사용하여 데이터를 분석하면 고유한 분류 방법을 가진 데이터를 기반으로한 이상치 검색 및 누락된 값 대체 등의 추가적인 추론 분석을 제공할 수 있습니다. 이는 대규모 데이터셋에서 더욱 유용합니다.

성능 문제가 발생할 수 있으므로 데이터셋 크기 및 분석 요구 사항을 고려하여 적절한 함수를 선택하는 것이 중요합니다. 이러한 과제를 해결하기 위해 판다는 파이썬으로 작성된 고성능 데이터 분석 도구로, 데이터의 처리 및 조작을 단순화하고 코드 작성 시간을 단축시킬 수 있습니다.

결론적으로, 빅데이터 분석에서 다중 그룹by 열에 다중 함수를 적용하는 것은 통계 분석 및 패턴 인식에 매우 유용합니다. 이를 통해 데이터셋을 더욱 효과적으로 분석하고, 추가 분석 기능을 제공할 수 있습니다.

반응형
Comments