Python 基于单独列中下方单元格(行)的结果显示列结果

Python 基于单独列中下方单元格(行)的结果显示列结果,python,pandas,dataframe,loc,Python,Pandas,Dataframe,Loc,我认为这应该相对容易,但我是个笨蛋 需要在新的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','B

我认为这应该相对容易,但我是个笨蛋

需要在新的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列)来返回基于以下内容的结果

从数据帧的底部开始。列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)
numpy.select&Series.shift
我们可以使用它来定义多个条件,并根据这些条件为新列B赋值

在我们的条件中,我们使用我们使用的,以便我们可以检查下一个值是
SELL
还是
BUY

与例如使用
=='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