programing

특정 조건을 세고 합산하는 판다

powerit 2023. 5. 13. 11:04
반응형

특정 조건을 세고 합산하는 판다

판다에는 특정 조건을 합산하는 SUMIF와 Excel에서 특정 조건의 값을 계산하는 COUNTIF의 동등한 기능을 수행하는 단일 기능이 있습니까?

사용할 수 있는 여러 단계 기능이 있다는 것을 알고 있습니다.

예를 들면sumif사용할 수 있습니다(df.map(lambda x: condition) or df.size())그 다음에 사용.sum()에 대해서도countif사용할 수 있습니다(groupby functions그리고 내 대답을 찾거나 필터를 사용하고 그리고..count()).

조건과 데이터 프레임을 입력하고 합계 또는 카운트된 결과를 얻는 이러한 기능을 수행하는 간단한 한 단계 프로세스가 있습니까?

먼저 조건부 선택을 하고 다음을 사용하여 선택 결과를 요약할 수 있습니다.sum기능.

>> df = pd.DataFrame({'a': [1, 2, 3]})
>> df[df.a > 1].sum()   
a    5
dtype: int64

두 가지 이상의 조건이 있는 경우:

>> df[(df.a > 1) & (df.a < 3)].sum()
a    2
dtype: int64

당신이 하고 싶다면,COUNTIF그냥 대체합니다.sum()와 함께count()

다음과 같은 데이터 프레임의 고급 인덱싱 기능에 대해서는 언급하지 않았습니다.

>>> df = pd.DataFrame({"class":[1,1,1,2,2], "value":[1,2,3,4,5]})
>>> df[df["class"]==1].sum()
class    3
value    6
dtype: int64
>>> df[df["class"]==1].sum()["value"]
6
>>> df[df["class"]==1].count()["value"]
3

대체할 수 있습니다.df["class"]==1다른 조건으로

저는 보통 논리적 조건 열 위에 numpy sum을 사용합니다.

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'Age' : [20,24,18,5,78]})
>>> np.sum(df['Age'] > 20)
2

위에 제시된 솔루션보다 약간 짧은 것 같습니다.

여러 조건(예: COUNTIFS/SUMIFS)의 경우 편리한 방법은 다음과 같습니다.query크기가 큰 프레임(성능이 실제로 중요한 경우)에서는 매우 빠르고 괄호, 비트 단위 등에 대해 걱정할 필요가 없기 때문입니다.예를 들어, 계산할 경우=SUMIFS(C2:C8, A2:A8,">1", B2:B8, "<3")사용할 수 있습니다.

df.query("A>1 and B<3")['C'].sum()
# or 
df.iloc[:8].query("A>1 and B<3")['C'].sum()    # where the range is specified as in SUMIFS

COUNTIFS의 경우 조건을 간단히 요약할 수 있습니다.예를 들어, 계산할 경우=COUNTIFS(A2:A8,">0", B2:B8, "<3")할 수 있는 일:

countifs = ((df['A']>1) & (df['B']<3)).sum()

아니면 그냥 전화.query그리고 결과의 길이를 계산합니다.

countifs = len(df.query("A>1 and B<3"))

또한 다음을 사용하여 COUNTIFS에 범위를 제공하는 방법과 유사한 범위를 지정할 수 있습니다.iloc:

countifs = len(df.iloc[:8].query("A>1 and B<3"))

행 단위로 COUNTIF/SUMIF를 수행하려면 다음을 사용할 수 있습니다.axis=1논쟁.다시, 범위는 열 목록으로 제공됩니다.['A', 'B']) 범위가 COUNTIF에 공급되는 방식과 유사합니다.

또한 COUNTIF(COUNTIFS에 해당하는 판다와 유사)의 경우 조건을 합산하면 충분하지만 SUMIF의 경우 프레임을 인덱싱해야 합니다.

df['COUNTIF'] = (df[['A', 'B']] > 1).sum(axis=1)
df['SUMIF'] = df[df[['A', 'B']] > 1].sum(axis=1)
# equivalently, we can use `where` to make a filter as well
df['SUMIF'] = df.where(df[['A', 'B']] > 1, 0).sum(axis=1)

# can use `agg` to compute countif and sumif in one line.
df[['COUNTIF', 'SUMIF']] = df[df[['A', 'B']] > 1].agg(['count', 'sum'], axis=1)

res1

열 단위로 COUNTIF/SUMIF를 수행하려면 다음을 사용할 수 있습니다.axis=0인수(기본값)입니다.여기서 범위(처음 3행)는 다음을 사용하여 선택됩니다.iloc.

df.loc['COUNTIF'] = (df.iloc[:3] > 1).sum()
df.loc['SUMIF'] = df.where(df.iloc[:3] > 1, 0).sum()
# or
df.loc['SUMIF'] = df[df.iloc[:3] > 1].sum()

res2

여러 행/열에 걸친 COUNTIF/SUMIF의 경우, 예를 들어,=COUNTIF(A2:B4, ">1"),불러sum두 번(한 번은 열 단위 합에 대해, 다른 한 번은 열 단위 합에 대해, 다른 한 번은 열 단위 합에 대해).

countif = (df.iloc[:4, :2]>1).sum().sum()    # the range is determined using iloc
sumif = df[df.iloc[:4, :2] > 1].sum().sum()  # first 4 rows and first 2 columns

언급URL : https://stackoverflow.com/questions/20995196/pandas-counting-and-summing-specific-conditions

반응형