2016-09-25 2 views
0

팬더에 대한 경험이별로 없지만 스레드를 검색했지만 비슷한 것을 찾을 수 없습니다.팬더가있는 테이블 변환

나는 다음과 같은 구조로 큰 1mil 기록 테이블이

,

+-------+-------+-------------+-----------+ 
| rec | code | code group | code Date | 
+-------+-------+-------------+-----------+ 
| 10001 | X11 | High  | 20151105 | 
| 10001 | X11.1 | High  | 20150205 | 
| 10001 | X12 | Medium  | 20141111 | 
| 10001 | X12.1 | Medium  | 20141111 | 
| 10001 | X13 | Low   | 20130101 | 
| 10001 | Y15 | No Interest | 20130101 | 
| 10001 | Y16 | No Interest | 20141231 | 
| 10002 | X11 | …   | …   | 
| 10002 | X12 | …   | …   | 
| 10002 | X13 | …   | …   | 
+-------+-------+-------------+-----------+ 

테이블로를 구성하고 싶습니다 만의 고유 녹화가 상주하고 다음과 같은 형식으로됩니다 있었다 :

헤더 : 녹화 | 높음 (가장 큰 날짜) | 보통 (가장 큰 날짜) | 낮음 (가장 큰 날짜) | 코드 (가장 큰 날짜 만) | 높은 코드 (조사)

+2

질문을보고 이해할 수있는 표 형식으로 표기하십시오. 나는 당신의 의견으로 이것을했지만 출력을 위해 그것을 할 수는 없다. –

+0

죄송합니다. 첫 번째 cur ...은 (는) 테이블을 잊어 버렸습니다. 고맙습니다 – pythonED

+0

예상되는 결과가 여전히 명확하지 않습니다 (높음 코드 (가장 큰 날짜)). 행 예제를 주시겠습니까? – Romain

답변

0

여기에 몇 가지 단서가 있습니다.

pivot = pd.pivot_table(df, 
       index = 'rec', 
       columns='code group', 
       values='code Date', 
       aggfunc='max') 

# code group  High  Medium 
# rec        
# 10001  2015-11-05  NaT 
# 10002  2015-10-04 2015-10-04 

어떻게 가장 높은 날짜 코드를 얻기 위해 "촬영, 고 (큰 일), 중간 (큰 일), 저 (큰 일)"을 얻을 수있는 방법
# Test data 
df = DataFrame({'rec': [10001, 10001, 10002, 10002], 
'code': ['X11', 'X12', 'X11.1', 'X12'], 
'code group': ['High', 'High', 'High', 'Medium'], 
'code Date': ['20151105', '20141111', '20151004', '20151004'] 
}, columns = ['rec', 'code', 'code group', 'code Date']) 

# Converting dates 
df['code Date'] = pd.to_datetime(df['code Date']) 

#  rec code code group code Date 
# 0 10001 X11  High 2015-11-05 
# 1 10001 X12  High 2014-11-11 
# 2 10002 X11.1  High 2015-10-04 
# 3 10002 X12  Medium 2015-10-04 

및 행수의 카운트

# Filterting and sorting the values in order to have last dates first 
filt = df[df['code group'] == 'High'].sort_values(['rec', 'code Date'], ascending=[True, False]) 
# Keeping the first value for code (the one with last date), and counting the rows 
filt = filt.groupby('rec').agg({'code': 'first', 'code Date': 'size'}) 

#  code Date code 
# rec      
# 10001   2 X11 
# 10002   1 X11.1 

최종 결과를 얻기 위해 데이터를 어셈블합니다.

pivot.join(filt).rename(columns={'code Date': 'count'}) 

# code group  High  Medium count code 
# rec           
# 10001  2015-11-05  NaT  2 X11 
# 10002  2015-10-04 2015-10-04  1 X11.1 
+0

댓글을 쓰는 경우 고맙습니다. 결과 테이블의 형식 문제에 대해 사과드립니다. 또한 코드의 첫 번째 부분에 도달했지만 머리글에 코드 그룹을 조인하고 최대 날짜가 – pythonED

+0

인 피벗의 경우 두 개의 10001 레코드가 무효화되고 솔루션에 두 개의 열을 추가하여 도달했습니다. 첫 번째 열은 하나의 기록에 대해 최대 및 최대 날짜에 대한 코드 (예 : 'X11')를 읽습니다. 두 번째는 하나의 레코드에 대해 하이의 카운트를 읽습니다. Thanx가 의미가 있기를 바랍니다. – pythonED

+0

고맙습니다. df 피벗에 새 열을 추가하면 new_series가 추가되는 것처럼 보입니다. – pythonED

관련 문제