Python:重新组织一个数据框,其中重复的值出现在一列中。

时间:2017-11-30 19:34:22

标签: python pandas dataframe data-manipulation

我有一个如下所示的数据框:

     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。在第一个数据帧中,我只进行一次呼叫并提取所有这些数据,而在另一个数据帧中,我每个日期都进行一次呼叫。所以1st比第二个效率更高,并且认为这是正确的调用,但我仍然坚持将数据帧重组为我需要的部分。

我想创建一个空的数据框,然后通过选择' Instrument'中的重复元素的索引来填充它。列,使用这些索引从“总回报”中获取元素。列,然后相应地放置该数据块中的元素,但我不知道如何做到这一点。

如果有人可以帮助我,我会很高兴知道。

不确定此时是否有用,但这是我在第二版中生成数据框(填充之前)的方式:

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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

对我来说这看起来像pandas.pivot_table()pivot_table,请注意如果您认为会有重复项(例如每天只有一个读数),您可以添加一个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