【问题标题】:Converting MultiIndex Pandas DataFrame to Pivot将 MultiIndex Pandas DataFrame 转换为 Pivot
【发布时间】:2020-05-27 08:38:09
【问题描述】:

看起来这应该很容易,但我无法让它为我的生活工作。

我有一个用于股票数据的数据框,如下所示。如何将以下数据框转换为数据透视表,其中日期为行,股票代码为列,Adj Close 为值(底部图片)

我正在使用以下代码获取数据框: pricing = web.DataReader(['MSFT', 'AAPL'], 'yahoo', datetime.datetime(2020, 1, 1), datetime.datetime(2020, 2, 10))

数据帧 数据透视表

编辑:

如果我只是做pricing = web.DataReader(['MSFT', 'AAPL'], 'yahoo', datetime.datetime(2020, 1, 1), datetime.datetime(2020, 2, 10))['Adj Close'],那么我会遇到问题,使用 .loc[] 来使用另一个枢轴的索引抓取数据。

我有第二个数据透视表(如下所示),当我尝试执行 price.loc[pivot2.index] 时出现错误。

错误:

KeyError: "没有 [DatetimeIndex(['1999-01-01', '2000-01-01', '2003-01-01', '2004-01-01',\n '2005-01 -01', '2006-01-01', '2007-01-01', '2008-01-01',\n '2009-01-01', '2010-01-01', '2011-01 -01', '2012-01-01',\n '2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01',\n '2017 -01-01', '2018-01-01', '2019-01-01'],\n dtype='datetime64[ns]', name='date', freq=None)] 在 [index ]"

【问题讨论】:

  • 从“编辑”你得到什么错误,你的 pivot2 的索引是否与定价相同?如果定价中缺少索引,您可以考虑使用 reindex 而不是 .loc。
  • 添加了错误。我猜这是因为定价并不总是有pivot2传递的指数,因为pivot2总是在一年的第二天作为日期传递,但市场并不总是在一年的第二天开放,所以那天不会有输入。如果传入的索引不起作用,是否可以轻松使用最近的日期?还是我需要更新定价数据框以包含每天的数据?
  • 您可以使用pricing.reindex(pivot2.index),这将为缺少的索引返回NaN,并使用ffillfillna之类的东西,并具有预定值。

标签: python pandas dataframe pivot pivot-table


【解决方案1】:

尝试使用:

pricing['Adj Close']

在哪里,

pricing = pd.DataFrame(np.random.randint(50,75,(10,6)), 
                  index=pd.date_range('01/2/20', periods=10, freq='D'),
                 columns=pd.MultiIndex.from_product([['Adj Close', 'Close', 'High'],['MSFT', 'AAPL']]))

           Adj Close      Close      High     
                MSFT AAPL  MSFT AAPL MSFT AAPL
2020-01-02        67   71    58   60   50   53
2020-01-03        54   59    64   72   62   50
2020-01-04        51   53    56   70   63   51
2020-01-05        64   71    74   62   68   62
2020-01-06        74   68    69   71   60   62
2020-01-07        55   55    51   70   74   72
2020-01-08        60   58    74   70   73   69
2020-01-09        51   58    72   54   50   61
2020-01-10        64   56    74   52   59   57
2020-01-11        55   50    68   61   60   59

使用Basic indexing on axis with MultiIndex,我们只需在级别 0 选择“Adj Close”即可。

pricing['Adj Close']

输出:

            MSFT  AAPL
2020-01-02    66    51
2020-01-03    67    67
2020-01-04    74    74
2020-01-05    73    66
2020-01-06    68    52
2020-01-07    67    50
2020-01-08    73    54
2020-01-09    66    52
2020-01-10    62    73
2020-01-11    61    71

【讨论】:

  • 感谢您的回答!这导致我遇到另一个问题。添加了对原始问题的编辑
  • @connorvo 查看问题中的评论。
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2017-04-28
  • 2023-03-02
  • 2021-12-25
  • 2017-03-17
相关资源
最近更新 更多