판다는 누적합에 따라 분류합니다.
다음과 같이 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
대신에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()
)
)
언급URL : https://stackoverflow.com/questions/22650833/pandas-groupby-cumulative-sum
'source' 카테고리의 다른 글
| upload_가 포함된 Django FileField는 런타임에 결정됩니다. (0) | 2023.07.19 |
|---|---|
| 개체를 매개 변수로 사용하는 클래스 (0) | 2023.07.19 |
| 특정 조건에서 Recycler View에서 항목을 숨기는 방법은 무엇입니까? (0) | 2023.07.19 |
| SQL 2000/2005에서 Oracle 데이터베이스에 연결된 서버를 어떻게 설정합니까? (0) | 2023.07.19 |
| 입력 값이 VUEX에 전달되지 않는 이유 (0) | 2023.07.19 |

