2017-11-30 9 views
1

私はこのようになりますデータフレームを持っている:Python:1つの列に繰り返し値が表示されたデータフレームを再編成します。

 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 

はデータフレームが、私はそれがこのように見えるようにしたいと考える:

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

基本的に私が欲しいもののように、すべての日付を配置することです新しい列とその列の中に、対応する値を配置します。私は、 "フィルタリング"や "重複を削除"とは言いませんが、これははるかに再配置のようなものです。

両方のデータフレームが私によって生成されましたが、このデータを取得するためにはAPIを呼び出す必要があります。最初のデータフレームでは、1つのコールのみを行い、すべてのデータをプルします。一方、他のデータフレームでは、それぞれのデータを1つのコールにします。だから1stは2ndよりもはるかに効率的だと思っていましたが、それは正しい呼び出しだと思っていましたが、私は必要なものにデータフレームを再編成するこの部分に固執しています。

私は空のデータフレームを作成し、「Instrument」列の繰り返し要素のインデックスを選択し、それらのインデックスを使用して「Total Return」列から要素を取得し、その要素からその要素を配置することを考えましたそれに応じてデータを処理する方法はわかりません。

誰かが私を助けることができれば、私は知ってうれしいです。

ないこの時点で便利な場合は必ず、私は第二版では(それを移入する前に)データフレームを生成する方法この:

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を使用することができます。

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

出力:

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、重複があると思う場合はagg関数を追加できます(例では1日に1つの読みにしか見えません)。

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

これも良いアプローチです。ありがとうございました! –

関連する問題