【问题标题】:Reset columns index after reshaping dataframe of stock prices using pandas使用熊猫重塑股票价格数据框后重置列索引
【发布时间】:2021-01-17 05:38:03
【问题描述】:

我有一个股票每天的开盘价和收盘价的数据框。

    ticker          Date         Open        Close  
0      CAMT    2021-01-14    24.150000    24.740000  
1      CAMT    2021-01-15    24.540001    24.400000  
2         F    2021-01-14     9.810000    10.170000  
3         F    2021-01-15    10.040000     9.830000  
4      GKOS    2021-01-14    84.050003    86.709999  
5      GKOS    2021-01-15    86.250000    86.339996  

我从这个数据框中创建了一个新的数据框,其中每一行包含一只股票和每天的开盘/收盘列。 我使用了这段代码:

df.pivot(index='ticker', values=['Open', 'Close'], columns='Date').reset_index(drop=False)

它返回这个数据框:

     ticker                Open                                   Close
Date        2021-01-14 00:00:00 2021-01-15 00:00:00 2021-01-14 00:00:00 2021-01-15 00:00:00
0      CAMT           24.150000           24.540001           24.740000           24.400000
1         F            9.810000           10.040000           10.170000            9.830000
2      GKOS           84.050003           86.250000           86.709999           86.339996
3      IGBH           25.180000           24.959999           25.110001           24.950001

我想重置如下列的索引:

     ticker        Open_14-01-2021      Close_14-01-2021     Open_15-01-2021    Close_15-01-2021     
0      CAMT           24.150000           24.540001           24.740000           24.400000
1         F            9.810000           10.040000           10.170000            9.830000
2      GKOS           84.050003           86.250000           86.709999           86.339996
3      IGBH           25.180000           24.959999           25.110001           24.950001

我试过了,但没用:

df.columns = df.columns.droplevel(0)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先透视,然后使用简单的列表推导通过连接每个级别的标签将列上的 MultiIndex 折叠成一个简单的索引。然后我们重置索引以将'ticker' 移回列中。

    df = df.pivot(index='ticker', values=['Open', 'Close'], columns='Date')
    df.columns = [f'{x}_{y.strftime("%d-%m-%Y")}' for x,y in df.columns]
    df = df.reset_index()
    

      ticker  Open_14-01-2021  Open_15-01-2021  Close_14-01-2021  Close_15-01-2021
    0   CAMT        24.150000        24.540001         24.740000         24.400000
    1      F         9.810000        10.040000         10.170000          9.830000
    2   GKOS        84.050003        86.250000         86.709999         86.339996
    

    【讨论】:

    • 返回错误:“TypeError: sequence item 1: expected str instance, Timestamp found”
    • @khaledkoubaa 那是因为你的日期是datetime64[ns],我假设了字符串。我修改了解决方案来处理它们,现在可以工作了。
    • 它返回此错误: AttributeError: 'str' object has no attribute 'strftime' ,因此如果不是 isinstance(y, str) 我将其添加到列表理解中并返回此错误:ValueError: Length不匹配:预期轴有 11 个元素,新值有 10 个元素
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2019-06-30
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多