2016-11-22 6 views
0

팬더 dataframe :팬더 데이터 프레임의 값을 각 그룹의 첫 번째 행으로 나누는 방법은 무엇입니까?

>>> df 
        sales net_pft 
STK_ID RPT_Date     
002138 20140930 3.325 0.607 
     20150930 3.619 0.738 
     20160930 4.779 0.948 
600004 20140930 13.986 2.205 
     20150930 14.226 3.080 
     20160930 15.499 3.619 
600660 20140930 31.773 5.286 
     20150930 31.040 6.333 
     20160930 40.062 7.186 

는 그냥 각 행의 값으로 출력을 얻을하는 방법을 알고 싶어이 같은 각 그룹의 첫 번째 행에 의해 구분됩니다

    sales net_pft 
STK_ID RPT_Date     
002138 20140930 1.000 1.000 
     20150930 1.088 1.216 
     20160930 1.437 1.562 
600004 20140930 1.000 1.000 
     20150930 1.017 1.397 
     20160930 1.108 1.641 
600660 20140930 1.000 1.000 
     20150930 0.977 1.198 
     20160930 1.261 1.359 

감사합니다,

답변

1
import pandas as pd 

df = pd.DataFrame({'RPT_Date': ['20140930', '20150930', '20160930', '20140930', '20150930', '20160930', '20140930', '20150930', '20160930'], 'STK_ID': ['002138', '002138', '002138', '600004', '600004', '600004', '600660', '600660', '600660'], 'net_pft': [0.607, 0.738, 0.948, 2.205, 3.080, 3.619, 5.286, 6.333, 7.186], 'sales': [3.325, 3.619, 4.779, 13.986, 14.226, 15.499, 31.773, 31.040, 40.062]}) 
df = df.set_index(['STK_ID','RPT_Date']) 

firsts = (df.groupby(level=['STK_ID']).transform('first')) 
result = df/firsts 

    net_pft  sales 
STK_ID RPT_Date      
002138 20140930 1.000000 1.000000 
     20150930 1.215815 1.088421 
     20160930 1.561779 1.437293 
600004 20140930 1.000000 1.000000 
     20150930 1.396825 1.017160 
     20160930 1.641270 1.108180 
600660 20140930 1.000000 1.000000 
     20150930 1.198070 0.976930 
     20160930 1.359440 1.260882 
을 수득 3,691,363,210는

주요 트릭 상기 df 동일한 형상 인 DataFrame 을 만들 groupby/transform('first')를 사용하지만, 그 값이 각 그룹의 첫 번째 행에서 올 :

firsts = df.groupby(level=['STK_ID']).transform('first') 
#     net_pft sales 
# STK_ID RPT_Date     
# 002138 20140930 0.607 3.325 
#  20150930 0.607 3.325 
#  20160930 0.607 3.325 
# 600004 20140930 2.205 13.986 
#  20150930 2.205 13.986 
#  20160930 2.205 13.986 
# 600660 20140930 5.286 31.773 
#  20150930 5.286 31.773 
#  20160930 5.286 31.773 

이것은 방탕이지만 메모리 사용으로 인해 Python에서 그룹을 반복하지 않으므로 원하는 결과를 얻을 수있는 가장 빠른 방법입니다. 나는 판다 13.0을 사용

result = list() 
for key, grp in df.groupby(level=['STK_ID']): 
    result.append(grp/grp.iloc[0]) 
result = pd.concat(result) 
print(result) 
+0

같은 문제를 충족 : 위의 코드는 팬더 버전 0.13에서 TypeError: Transform function invalid for data types을 제기하는 경우


,이 해결 방법을 사용하여 시도해 볼 수도 있습니다 (>>> 첫번째 = df.groupby 추적 (가장 최근의 마지막 통화) : 파일 "", 줄 1, 파일 "C : \ Anaconda \ lib \ site-packages \ pandas"파일의 변환 ('처음' \ core \ groupby.py ", 줄 2319, 변환시 return self._transform_item_by_item (obj, fast_path) 파일 "C : \ Anaconda \ lib \ site-packages \ pandas \ core \ groupby.py", 2386 줄, _transform_item_by_item에 올리기 TypeError ('데이터 형식에 대해 변환 함수가 유효하지 않음') TypeError : 데이터 형식에 대해 변환 함수가 잘못되었습니다. – bigbug

+0

'df '에있는 열의 dtyp은 무엇입니까? 'df.info()'를 게시하십시오. – unutbu

+0

>>> df.info() <클래스 'pandas.core.frame.DataFrame'> MultiIndex : 9 개 항목 (002,138, 20,140,930) (600,660, 20,160,930) 데이터 열 (총 2 열) 판매 9 null 이외의 float64 net_pft 9 null 이외의 float64 dtypes : float64 (2) >>> – bigbug

관련 문제