Python 基于单独列中下方单元格(行)的结果显示列结果
我认为这应该相对容易,但我是个笨蛋 需要在新的pandas列(称为B列)中返回结果,该列基于a列中下一行的结果 请打印下面的代码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
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