2016-08-22 4 views
1

작업을 수행하는 데 어려움이 있습니다. 데이터 프레임에 3 열 : length, reachcode, and year이 있습니다.데이터 열 3 개를 사용하여 팬더 조작 데이터 프레임

내 예를 들어 dataframe : 나는 하나 년 이내에 'reachcode'중복을 발견하고 그 해에 대한 '길이'를 요약하기 위해 노력하고있어

year reachcode length 
1988 1000  1.2 
1988 1000  2.0 
1990 1000  0.3 
1993 1000  0.5 

.

그 다음에는 합산 된 '길이'값을 다른 '도달 코드'와 비교하여 가장 작은 값을 유지하려고합니다.

따라서 예제 데이터 프레임에서 길이 1.2와 2.0은 1998 년과 reachcode = 1000에 대해 합산되며 그 값 (3.2)은 1990 년과 1993 년과 비교되며 값 0.3과 도달 코드는 새로운 명부.

나는 팬더에 대한 경험이 있지만 이전에 다루지 않은 것보다 더 복잡한 작업입니다. 내 실제 데이터 프레임은 약 40,000 행이므로 자동화 된 방법을 찾는 것이 매우 유용 할 것입니다. 어떤 도움을 주셔서 감사합니다.

답변

2

double-stage groupby이 필요합니다. 당신이 length의 분을 위해 더 reachcode을 GROUPBY 수 있도록 먼저 인덱스를 재설정 yearreachcode을 GROUPBY과 합계를 계산 :

df.groupby(['year', 'reachcode']).sum().reset_index().groupby('reachcode')['length'].min() 

# reachcode 
#  1000 0.3 
# Name: length, dtype: float64 
+1

너무 감사합니다! 최근에 groupby를 많이 사용했지만, 나에게 보여준 것처럼 두 단계로 할 수 있다는 것을 결코 깨닫지 못했습니다. 정말 감사합니다! – gball

2

간단히 groupby 집계를 실행

df['lengthsum'] = df.groupby(['year', 'reachcode'])['length'].transform(sum) 

df['lengthmin'] = df.groupby(['reachcode'])['lengthsum'].transform(min) 

# year reachcode length lengthsum lengthmin 
# 0 1988  1000  1.2  3.2  0.3 
# 1 1988  1000  2.0  3.2  0.3 
# 2 1990  1000  0.3  0.3  0.3 
# 3 1993  1000  0.5  0.5  0.3 
+0

좋습니다. 변환 함수는 매우 유용합니다. 감사 – gball