【问题标题】:pandas column result based on result of below cell (row) in separate columnpandas 列结果基于单独列中以下单元格(行)的结果
【发布时间】:2019-09-23 07:21:21
【问题描述】:

我认为这应该相对容易,但我是菜鸟!

需要在新的 pandas 列(称为此列 B)中返回结果,该列基于 A 列中以下行的结果。

请打印以下代码

import pandas as pd
df = pd.DataFrame({'A': ['BUY', 'BUY', 'HODL', 'SELL', 'HODL', 'HODL', 'BUY', 'SELL', 'SELL', 'BUY', 'BUY', 'HODL', 'SELL', 'SELL', 'SELL', 'HODL', 'SELL', 'SELL','BUY']})
print(df)

我需要一个新列(B 列)来根据以下内容返回结果。

从 pandas 数据框的底部开始。 A 列中的最后一个单元格(即 A18 = 'BUY')总是可以为 B 列中的最后一个单元格返回相同的结果。

A 列(即A17)的下一行是“卖出”。我认为这是一个变化,因此单元格 B17 现在也应该是“卖出”

A 列中的下一行(即A16)再次是“卖出”。由于这与 A17 没有任何变化,因此单元格 B16 现在应该是“NA”

A 列(即A15)中的下一行是“HODL”。所有“HODL”单元格应始终反映为 B 列中的“HODL”单元格

如果单元格 A15 再次为“卖出”,则在 B 列中将应用另一个“NA”。

“卖出”单元格的相同原则适用于“买入”单元格

提供以下 df 仅用于提供预期结果的可视化:

import pandas as pd

df = pd.DataFrame({'A': ['BUY', 'BUY', 'HODL', 'SELL', 'HODL', 'HODL', 'BUY', 'SELL', 'SELL', 'BUY', 'BUY', 'HODL', 'SELL', 'SELL', 'SELL', 'HODL', 'SELL', 'SELL','BUY'], 'B': ['NA', 'BUY', 'HODL', 'SELL', 'HODL', 'HODL', 'BUY', 'NA', 'SELL', 'NA', 'BUY', 'HODL', 'NA', 'NA', 'SELL', 'HODL', 'NA', 'SELL','BUY']})

print(df)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    numpy.select & Series.shift

    我们可以为此使用numpy.select,这样我们就可以定义多个条件,并根据这些条件为您的新列 B 分配值。

    在我们的条件下,我们使用Series.shift,因此我们可以检查下一个值是SELL 还是BUY

    Series.eq== 'SELL' 相同,例如

    注意我反转了你的数据框,因为你想从下到上应用逻辑,我用df[::-1] 来做这个。这与在 Python 中反转列表的方法相同。

    # Reverse dataframe
    df = df[::-1]
    
    conditions = [
        df['A'].eq('HODL'),
        df['A'].eq('SELL') & df['A'].shift().eq('SELL'),
        df['A'].eq('BUY') & df['A'].shift().eq('BUY')
    ]
    
    choices = ['HODL', 'NA', 'NA']
    
    df['B'] = np.select(conditions, choices, default=df['A'])
    
    # Reverse dataframe back to original state
    df = df[::-1]
    

    输出

    print(df)
           A     B
    0    BUY    NA
    1    BUY   BUY
    2   HODL  HODL
    3   SELL  SELL
    4   HODL  HODL
    5   HODL  HODL
    6    BUY   BUY
    7   SELL    NA
    8   SELL  SELL
    9    BUY    NA
    10   BUY   BUY
    11  HODL  HODL
    12  SELL    NA
    13  SELL    NA
    14  SELL  SELL
    15  HODL  HODL
    16  SELL    NA
    17  SELL  SELL
    18   BUY   BUY
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2013-08-02
      • 2017-02-06
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      相关资源
      最近更新 更多