我认为这应该相对容易一些,但是我是菜鸟!
需要在新的pandas列(称为B列)中返回结果,该列基于A列下一行的结果。
请打印以下代码
err: { SequelizeValidationError: notNull Violation: projects.name cannot be null ... }
我需要一个新列(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']})
print(df)
答案 0 :(得分: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