Pandas는 groupby로 합계하지만 특정 열은 제외합니다.


88

Pandas 데이터 프레임에서 groupby를 수행하지만 해당 groupby에서 일부 열을 제외하는 가장 좋은 방법은 무엇입니까? 예를 들어 다음 데이터 프레임이 있습니다.

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          Wheat   5312        Ha      10       20      30
2      Afghanistan  25          Maize   5312        Ha      10       20      30
4      Angola       15          Wheat   7312        Ha      30       40      50
4      Angola       25          Maize   7312        Ha      30       40      50

Country 및 Item_Code 열을 그룹화하고 Y1961, Y1962 및 Y1963 열에 속하는 행의 합계 만 계산하고 싶습니다. 결과 데이터 프레임은 다음과 같아야합니다.

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          C3      5312        Ha      20       40       60
4      Angola       25          C4      7312        Ha      60       80      100

지금 나는 이것을하고있다 :

df.groupby('Country').sum()

그러나 이렇게하면 Item_Code 열의 값도 더해집니다. sum()작업 에 포함 할 열과 제외 할 열을 지정할 수있는 방법이 있습니까?

답변:


117

groupby의 열을 선택할 수 있습니다.

In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
                       Y1961  Y1962  Y1963
Country     Item_Code
Afghanistan 15            10     20     30
            25            10     20     30
Angola      15            30     40     50
            25            30     40     50

전달 된 목록은 열의 하위 집합이어야합니다. 그렇지 않으면 KeyError가 표시됩니다.


1
각 국가 및 품목 코드에 대한 레코드 수를 다른 열로 포함하는 방법은 무엇입니까?
Sushant Kulkarni

1 만 포함하는 그룹화하기 전에 더미 열을 만들 수 있습니다. 그러면 sum은 이들을 합하여 개수를 만듭니다.
Matt W.

열 한두 개를 제외하고 싶다면 모든 열 이름을 얻은 listColumns = list(df.columns)다음 원하지 않는 열을 제거 listColumns.remove('Y1964')하고 마지막으로 합계를 계산합니다.df.groupby(['Country', 'Item_Code'])[listColumns].sum()
Roberto Stelling

감사합니다. groupby가 작동하도록 할 수 있지만 선택 부분은 아닙니다. 내가 넣은 열 목록은 데이터 프레임에 있지만 ValueError가 계속 발생합니다.cannot reindex from a duplicate axis
Bowen Liu

@BowenLiu 같은 이름의 열이 여러 개 있으면이 오류가 표시됩니다. 이 경우 iloc to 또는 loc을 사용하여 원하는 열을 가져와야합니다. groupby 전에 수행해야한다고 생각합니다.
Andy Hayden

40

agg기능은 당신을 위해 이것을 할 것입니다. 열과 함수를 열과 함께 dict로 전달하고 다음을 출력합니다.

df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]})  # Added example for two output columns from a single input column

그러면 그룹 별 열과 지정된 집계 열만 표시됩니다. 이 예에서는 'Y1962'에 적용된 두 개의 agg 함수를 포함했습니다.

보고자하는 것을 정확하게 얻으려면 그룹의 다른 열을 포함하고 프레임의 Y 변수에 합계를 적용합니다.

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})

1
감사합니다. 일반화 할 수 있습니까? Y1961 형식의 열이 많이 있으므로 다음과 같은 목록을 생성합니다. yrs = [ 'Y'+ str (x) for x in range (1961, 2010 + 1, 1)]. 솔루션이 agg 내부에서 'yrs'를 사용할 수 있습니까?
user308827 2015 년

이 아이디어가 정말 마음에 듭니다. 트릭은 값이 numpy sum 함수 인이 dict를 구성하는 것입니다. 반대로, 나머지 열을 모두 합하는 것이 원하는 경우 모든 group by 열이 group by 문에 포함되어 있으면 원래 솔루션이 작동합니다.
leroyJr 2015 년

11

많은 열에 적용하는보다 일반적인 방법을 찾고 있다면 열 이름 목록을 작성하여 그룹화 된 데이터 프레임의 인덱스로 전달하는 것입니다. 귀하의 경우 예를 들면 다음과 같습니다.

columns = ['Y'+str(i) for year in range(1967, 2011)]

df.groupby('Country')[columns].agg('sum')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.