2017-11-30 1 views
1

나는이처럼 보이는 dataframe 있습니다Python : 하나의 열에 반복되는 값이 나타나는 데이터 프레임을 재구성합니다.

 Instrument     Date Total Return 
0 KYG2615B1014 2017-11-29T00:00:00Z  0.000000 
1 KYG2615B1014 2017-11-28T00:00:00Z -10.679612 
2 KYG2615B1014 2017-11-27T00:00:00Z  -8.035714 
3 JP3843250006 2017-11-29T00:00:00Z  0.348086 
4 JP3843250006 2017-11-28T00:00:00Z  0.349301 
5 JP3843250006 2017-11-27T00:00:00Z  0.200000 

는 dataframe, 나는 그것을 같이하고 싶습니다 감안할 때 :

   11/27/2017 11/28/2017 11/29/2017 
KYG2615B1014 -8.035714 -10.679612 0.000000 
JP3843250006 0.200000 0.349301 0.348086 

기본적으로 내가 원하는 무엇으로 모든 날짜를 배치하는 것입니다 새 열과 해당 열 내부에 해당 값을 배치합니다. 나는 "필터링"또는 "중복"을 말하지 않을 것이고, 이것은 훨씬 더 정리하는 것과 같습니다.

두 데이터 프레임이 모두 생성되었지만이 데이터를 얻기 위해서는 API를 호출해야합니다. 첫 번째 데이터 프레임에서는 한 번만 호출하고이 데이터를 모두 가져 오는 반면 다른 데이터 프레임에서는 각 데이터를 한 번 호출합니다. 그래서 1st가 2 번째보다 훨씬 효율적이고 올바른 호출이라고 생각했지만, 필자는 필요한 부분에 데이터 프레임을 재구성하는이 부분에 갇혀 있습니다.

'Instrument'열에서 반복되는 요소의 인덱스를 선택하여 빈 데이터 프레임을 만든 다음 채우면 해당 인덱스를 사용하여 'Total Return'열에서 요소를 가져온 다음 해당 청크의 요소를 배치합니다 이에 따라 데이터를 수집 할 수 있지만 어떻게해야할지 모르겠다.

누군가 나를 도울 수 있으면 기꺼이 알게 될 것입니다.

나는 두번째 버전 (그것을 채우기 전) dataframe 생성이 어떻게되지 않음이 시점에서 유용한 경우 확실하지만, :

pd.crosstab(df.Instrument, df['Date'],values=df['Total Return'], aggfunc='mean') 

출력 :

import pandas as pd 
import datetime 

#Getting a list of dates 
start=datetime.date(2017,11,27) 
end=datetime.date.today() - datetime.timedelta(days=1) 
row_dates=[x.strftime('%m/%d/%Y') for x in pd.bdate_range(start,end).tolist()] 
#getting identifiers to be used on Eikon 
csv_data=pd.read_csv('171128.csv', header=None) 
identifiers=csv_data[0].tolist() 
df=pd.DataFrame(index=identifiers, columns=row_dates) 
+1

https://stackoverflow.com/questions/47152691/how-to-pivot-a-dataframe – Wen

+0

@Wen 감사합니다! 나중에 참조 할 수 있도록이 내용을 저장하겠습니다. 더 깊은 검색을하지 않으면 나쁘다. –

답변

1

당신은 pd.crosstab을 사용할 수 있습니다 :

Date   2017-11-27T00:00:00Z 2017-11-28T00:00:00Z 2017-11-29T00:00:00Z 
Instrument                  
JP3843250006    0.200000    0.349301    0.348086 
KYG2615B1014    -8.035714   -10.679612    0.000000 
+0

감사합니다! 이것은 아름답게 작동했습니다. 마지막에이 행을 추가하여 열 머리글을 원하는 형식의 날짜로 변경했습니다 (내 게시물 끝에있는 작은 스크립트에서 row_dates에 포함 된 내용을 확인하십시오). df.columns = row_dates –

+1

좋아요! 내가 도울 수있어서 기쁘다. –

+0

Btw, 얼마나 많은 aggfunc 크로스 탭 기능이 지원됩니까? –

1

이것은 pandas.pivot_table 모양() 나에게 pivot_table, duplicate가 있다고 생각되면 agg 함수를 추가 할 수 있습니다 (예를 들어 하루에 하나의 읽기와 같이 보임).

import pandas as pd 
instrument=['KYG2615B1014','KYG2615B1014','KYG2615B1014', 'JP3843250006', 'JP3843250006', 'JP3843250006'] 
date=['11/29/2017', '11/28/2017', '11/27/2017', '11/29/2017', '11/28/2017', '11/27/2017'] 
total_return=[0.0, -10.679612, -8.035714, 0.348086, 0.349301, 0.200000] 
stacked = pd.DataFrame(dict(Instrument=instrument, Date=date, Total_return=total_return) 
pd.pivot_table(stacked, values='Total_return', index='Instrument', columns='Date') 

은 다음을 반환

Date 11/27/2017 11/28/2017 11/29/2017 
Instrument   
JP3843250006 0.200000 0.349301 0.348086 
KYG2615B1014 -8.035714 -10.679612 0.000000 
+0

이것은 좋은 접근 방법이기도합니다. 고맙습니다! –

관련 문제