Pandas는 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')


답변