Programing

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

crosscheck 2020. 10. 19. 07:44
반응형

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


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()작업 에 포함 할 열과 제외 할 열을 지정할 수있는 방법이 있습니까?


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가 표시됩니다.


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})

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

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

df.groupby('Country')[columns].agg('sum')

참고 URL : https://stackoverflow.com/questions/32751229/pandas-sum-by-groupby-but-exclude-certain-columns

반응형