【问题标题】:Pandas Dataframe : Assigning conditional values to each dataframe row on values greater than or lower thanPandas Dataframe:为每个数据帧行分配大于或小于值的条件值
【发布时间】:2021-03-04 18:35:01
【问题描述】:

目前我有一个有股票行情和回报的数据框

ticker_name    return
"AAPL 2020"    -15%
"AAPL 2019"     20%
"AAPL 2018"     40%
"AAPL 2017"     30%
"AAPL 2016"    -10%
....

我也有过去 x 年的年度格式的指数回报数据。有了这些数据,想标记特定股票是否高于市场回报

sp_500_year return
"2020"      -30%
"2019"       10%
"2018"       10%
"2017"       10%
"2016"       20%
....

预期的输出是新列,它们是布尔格式的标签。如果他们的回报高于市场,则为 1,如果他们的表现落后于市场,则为 0。

ticker_name    return   above_market
"AAPL 2020"    -15%        1
"AAPL 2019"     20%        1
"AAPL 2018"     40%        1
"AAPL 2017"     30%        1
"AAPL 2016"    -10%        0
....



我发现了一个与我类似的问题,但是这个问题是比较字符串并且只有两个可能的输入(BULL 和 BEAR),而我的是浮动和变化(索引返回)。

Pandas: if row in column A contains "x", write "y" to row in column B

【问题讨论】:

    标签: python dataframe


    【解决方案1】:

    首先我建议将您的 ticker_name 列分成两列。

    df_ticker 下方存储您的第一个 DataFrame,其中包含股票代码、年份和回报。这里使用Series.str.split() 方法将代码与年份分开,然后我们使用这里描述的技巧Python pandas split column list into multiple columns

    df_ticker = df_ticker.join(pd.DataFrame(df_ticker['ticker_name'].str.split().tolist(), columns=['ticker', 'year']))
    

    创建了两个新列:

        ticker_name return  ticker  year
    0   AAPL 2020   -0.15   AAPL    2020
    1   AAPL 2019   0.20    AAPL    2019
    2   AAPL 2018   0.40    AAPL    2018
    3   AAPL 2017   0.30    AAPL    2017
    4   AAPL 2016   -0.10   AAPL    2016
    

    那么我建议将年份设置为索引,这样可以方便DataFrames之间的比较。

    df_ticker = df_ticker.set_index('year')
    

    赠款:

        ticker_name return  ticker
    year            
    2020    AAPL 2020   -0.15   AAPL
    2019    AAPL 2019   0.20    AAPL
    2018    AAPL 2018   0.40    AAPL
    2017    AAPL 2017   0.30    AAPL
    2016    AAPL 2016   -0.10   AAPL
    

    df_index = df_index.set_index('sp_500_year')
    

    赠款

        return
    sp_500_year 
    2020    -0.3
    2019    0.1
    2018    0.1
    2017    0.1
    2016    0.2
    

    现在您可以安全地比较两个 DataFrame

    df_ticker['above_index'] = df_ticker['return'] > df_index['return']
    
        ticker_name return  ticker  above_index
    year                
    2020    AAPL 2020   -0.15   AAPL    True
    2019    AAPL 2019   0.20    AAPL    True
    2018    AAPL 2018   0.40    AAPL    True
    2017    AAPL 2017   0.30    AAPL    True
    2016    AAPL 2016   -0.10   AAPL    False
    

    【讨论】:

    • 感谢您的帮助。感谢@arhr。
    猜你喜欢
    • 2021-09-30
    • 1970-01-01
    • 2016-03-18
    • 2019-08-30
    • 2018-09-01
    • 2022-11-23
    • 2023-02-23
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多