2016-07-08 4 views
1

숫자 값, 날짜 값 및 텍스트 값이 포함 된 pandas.DataFrame이 있습니다. 이런 식으로 뭔가 :팬더 피벗 포함 문자열 정렬

Strike StrikeCell          Expiration ExpirationCell         CellContents 
0 60.0 \n <div class="cell row-header strike itm" ... 2016-07-15 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="60.0" m... 
1 60.0 \n <div class="cell row-header strike itm" ... 2017-01-20 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="60.0" m... 
2 60.0 \n <div class="cell row-header strike itm" ... 2018-01-19 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="60.0" 
13 70.0 \n <div class="cell row-header strike itm" ... 2017-01-20 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="70.0" m... 
15 70.0 \n <div class="cell row-header strike itm" ... 2018-01-19 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="70.0" m... 
17 70.0 \n <div class="cell row-header strike itm" ... 2016-10-21 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="70.0" m... 
... 
562 260.0 \n <div class="cell row-header strike otm" ... 2017-01-20 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="260.0" ... 
564 270.0 \n <div class="cell row-header strike otm" ... 2017-01-20 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="270.0" ... 
565 280.0 \n <div class="cell row-header strike otm" ... 2017-01-20 \n <div class="cell col-header expiration">... \n <div class="cell option" strike="280.0" ... 

내 의도는 StrikeCell (오름차순) 첫 번째 열 아래 (오름차순) 컬럼에 걸쳐 ExpirationCell 테이블 내의 값으로 CellContents하는 것입니다. 기본적으로 HTML 형식의 내용으로 큰 피벗 테이블을 만들고 있습니다.

df.pivot(index='Strike', columns='Expiration', values='CellContents') 

Strike가 올바르게 정렬의 Expiration가 올바르게 정렬 :

나는 잘 작동 다음을 수행 할 수 있습니다. 내가 문자열 내용 StrikeCell를 사용하려고하고 ExpirationCell 경우

그러나, 다음과 같이

df.pivot(index='StrikeCell', columns='ExpirationCell', values='CellContents') 

정렬이 손실됩니다.

그래서 질문은 StrikeCell index로하고 columnsExpirationcell를 사용하는 동안 StrikeExpiration으로 오름차순 정렬을 회복하는 방법입니다.

pandas 0.18.1을 사용하십시오.

+0

그것은, 다른 문제에 대한 모양을하기 때문에 경우에 사용이 테스트'df'와 정렬 올바르게'DF = pd.DataFrame ({ 'StrikeCell ''[ 'f', 'e', ​​'c', 'd', 'a', b '], 'ExpirationCell ': ['c ','a ','b ','a ' ''CellContents ': ['a ','b ','c ','a ','a ', b']}) ' – jezrael

+0

테스트. 누구든지 기본 정렬을 알고 있습니까? –

+0

잘 모르겠지만 영숫자는 기본 정렬 일 수 있습니다. – jezrael

답변

1

나는 이것이 당신을 위해 일해야한다고 생각합니다.

먼저 ExpirationCellStrikeCell에 대한 주문을 수정합시다.

StrikeCell_ordered = df[['Strike', 'StrikeCell']].sort_values(by='Strike')['StrikeCell'] 
ExpirationCell_ordered = df[['Expiration', 'ExpirationCell']].sort_values(by='Expiration')['ExpirationCell'] 

그런 다음 피벗 및 reindex을 적용

pivoted_df = df.pivot(index='StrikeCell', columns='ExpirationCell', values='CellContents') 
result = pivoted_df.reindex(index=StrikeCell_ordered, columns=ExpirationCell_ordered) 
+1

'drop_duplicates' 메소드를'StrikeCell_ordered'와'ExpirationCell_ordered'에 추가해야합니다. 그렇지 않으면 중복 된'StrikeCell'과'ExpirationCell'을 피벗 시켰습니다. 그렇게하는 것이 효과가있었습니다. 고맙습니다! –

+0

@ strimp099 맞아, 중복 된 것을 깜빡했다. – ptrj