팬더에서 두 열로 그룹화 된 값을 합산하는 방법


21

다음과 같은 Pandas DataFrame이 있습니다.

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

다음과 같이 새 DataFrame을 생성하는 방법은 무엇입니까?

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

답변:


16

pivot_table 이것을 위해 만들어졌습니다 :

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

결과

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

개인적으로 나는이 접근법이 이해하기 쉽고, 복잡한 그룹 별 작업보다 확실히 더 피 토닉하다는 것을 알았습니다. 그런 다음 형식을 지정하려면 정리하면됩니다.

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

너에게주는

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
좋은! 이것이 정답입니다.
tuomastik

@Josh D. 이것은 시원하고 간단합니다! 그룹 별 작동 방식을 파악하려면 약간의 두뇌 능력이 필요하다는 데 동의합니다. 고맙습니다!
Kevin

8

팬더 블랙 매직 :

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

결과 df:

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

거룩한! 흑 마법은 너무 강력합니다! 고마워요!
Kevin

천만에요! 업데이트 된 답변을 참조하십시오. 식을 단순화하고 열 이름을 요청한대로 정확하게 수정했습니다.
tuomastik

이전 버전은 다른 복잡한 데이터 세트에 적용될 수 있기 때문에 이점이 있다고 생각합니다. 여기에 복사했습니다 : df.groupby ([ 'Date', 'Groups', 'data']) [ 'data']. sum (). sum (level = [ 'Date', 'Groups']). unstack ( 'Groups'). fillna (0)
Kevin

@Kevin이 답변이나 향후 답변으로 문제가 해결 되었다면, 답변을 수락하십시오.
tuomastik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.