source

판다는 누적합에 따라 분류합니다.

bestscript 2023. 7. 19. 22:46

판다는 누적합에 따라 분류합니다.

다음과 같이 Pandas 데이터 프레임에 누적 합계 열을 추가하고 싶습니다.

이름. 낮의 아니요.
잭. 월요일. 10
잭. 화요일. 20
잭. 화요일. 10
잭. 수요일 50
월요일. 40
수요일 110

다음이 됩니다.

Jack | Monday     | 10  | 10
Jack | Tuesday    | 30  | 40
Jack | Wednesday  | 50  | 90
Jill | Monday     | 40  | 40
Jill | Wednesday  | 110 | 150

다양한 조합을 시도해봤습니다.df.groupby그리고.df.agg(lambda x: cumsum(x))헛되이

이렇게 하면 됩니다. 필요합니다.groupby()두 번:

df.groupby(['name', 'day']).sum() \
  .groupby(level=0).cumsum().reset_index()

설명:

print(df)
   name        day   no
0  Jack     Monday   10
1  Jack    Tuesday   20
2  Jack    Tuesday   10
3  Jack  Wednesday   50
4  Jill     Monday   40
5  Jill  Wednesday  110

# sum per name/day
print( df.groupby(['name', 'day']).sum() )
                 no
name day           
Jack Monday      10
     Tuesday     30
     Wednesday   50
Jill Monday      40
      Wednesday  110

# cumulative sum per name/day
print( df.groupby(['name', 'day']).sum() \
         .groupby(level=0).cumsum() )
                 no
name day           
Jack Monday      10
     Tuesday     40
     Wednesday   90
Jill Monday      40
     Wednesday  150

첫 번째 합계에서 나온 데이터 프레임은 다음과 같이 인덱싱됩니다.'name'그리고 그 때까지'day'인쇄하면 볼 수 있습니다.

df.groupby(['name', 'day']).sum().index 

누적 합계를 계산할 때 다음과 같이 계산하려고 합니다.'name'첫 번째 인덱스(레벨 0)에 해당합니다.

마지막으로, 사용reset_index이름을 반복하게 됩니다.

df.groupby(['name', 'day']).sum().groupby(level=0).cumsum().reset_index()

   name        day   no
0  Jack     Monday   10
1  Jack    Tuesday   40
2  Jack  Wednesday   90
3  Jill     Monday   40
4  Jill  Wednesday  150

@Dmitry의 답변에 대한 수정.이것은 더 간단하며 팬더 0.19.0에서 작동합니다.

print(df) 

 name        day   no
0  Jack     Monday   10
1  Jack    Tuesday   20
2  Jack    Tuesday   10
3  Jack  Wednesday   50
4  Jill     Monday   40
5  Jill  Wednesday  110

df['no_csum'] = df.groupby(['name'])['no'].cumsum()

print(df)
   name        day   no  no_csum
0  Jack     Monday   10       10
1  Jack    Tuesday   20       30
2  Jack    Tuesday   10       40
3  Jack  Wednesday   50       90
4  Jill     Monday   40       40
5  Jill  Wednesday  110      150

이것은 판다 0.16.2에서 작동합니다.

In[23]: print df
        name          day   no
0      Jack       Monday    10
1      Jack      Tuesday    20
2      Jack      Tuesday    10
3      Jack    Wednesday    50
4      Jill       Monday    40
5      Jill    Wednesday   110
In[24]: df['no_cumulative'] = df.groupby(['name'])['no'].apply(lambda x: x.cumsum())
In[25]: print df
        name          day   no  no_cumulative
0      Jack       Monday    10             10
1      Jack      Tuesday    20             30
2      Jack      Tuesday    10             40
3      Jack    Wednesday    50             90
4      Jill       Monday    40             40
5      Jill    Wednesday   110            150

사용해야 합니다.

df['cum_no'] = df.no.cumsum()

http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.cumsum.html

그것을 하는 다른 방법.

import pandas as pd
df = pd.DataFrame({'C1' : ['a','a','a','b','b'],
           'C2' : [1,2,3,4,5]})
df['cumsum'] = df.groupby(by=['C1'])['C2'].transform(lambda x: x.cumsum())
df

enter image description here

대신에df.groupby(by=['name','day']).sum().groupby(level=[0]).cumsum()(위 참조) 당신은 또한 할 수 있습니다.df.set_index(['name', 'day']).groupby(level=0, as_index=False).cumsum()

  • df.groupby(by=['name','day']).sum()실제로는 두 열을 모두 다중 인덱스로 이동합니다.
  • as_index=False나중에 reset_index를 호출할 필요가 없음을 의미합니다.

data.csv:

name,day,no
Jack,Monday,10
Jack,Tuesday,20
Jack,Tuesday,10
Jack,Wednesday,50
Jill,Monday,40
Jill,Wednesday,110

코드:

import numpy as np
import pandas as pd

df = pd.read_csv('data.csv')
print(df)
df = df.groupby(['name', 'day'])['no'].sum().reset_index()
print(df)
df['cumsum'] = df.groupby(['name'])['no'].apply(lambda x: x.cumsum())
print(df)

출력:

   name        day   no
0  Jack     Monday   10
1  Jack    Tuesday   20
2  Jack    Tuesday   10
3  Jack  Wednesday   50
4  Jill     Monday   40
5  Jill  Wednesday  110
   name        day   no
0  Jack     Monday   10
1  Jack    Tuesday   30
2  Jack  Wednesday   50
3  Jill     Monday   40
4  Jill  Wednesday  110
   name        day   no  cumsum
0  Jack     Monday   10      10
1  Jack    Tuesday   30      40
2  Jack  Wednesday   50      90
3  Jill     Monday   40      40
4  Jill  Wednesday  110     150

버전 1.0부터 판다들은 윈도우 기능을 위한 새로운 api를 얻었습니다.

구체적으로, 이전에 달성한 것은

df.groupby(['name'])['no'].apply(lambda x: x.cumsum())  

또는

df.set_index(['name', 'day']).groupby(level=0, as_index=False).cumsum()

이제는

df.groupby(['name'])['no'].expanding().sum()

그룹화 기준 + 수준 작업보다 모든 창 관련 기능에 대해 직관적입니다.

비록 groupby를 사용하는 것을 배우는 것이 일반적인 목적에 유용할지라도.
문서 참조: https://pandas.pydata.org/docs/user_guide/window.html

한 줄로 작성하려는 경우(메소드를 파이프라인으로 전달하려는 경우) 먼저 설정할 수 있습니다.as_index의 매개 변수.groupby집계 단계에서 데이터 프레임을 반환하고 사용하는 Method to Falseassign()새 열(각 사용자의 누적 합계)을 할당합니다.

이러한 연결된 메서드는 새 데이터 프레임을 반환하므로 변수(예:agg_df) 나중에 사용할 수 있습니다.

agg_df = (
    # aggregate df by name and day
    df.groupby(['name','day'], as_index=False)['no'].sum()
    .assign(
        # assign the cumulative sum of each name as a new column
        cumulative_sum=lambda x: x.groupby('name')['no'].cumsum()
    )
)

res

언급URL : https://stackoverflow.com/questions/22650833/pandas-groupby-cumulative-sum