[英]pandas column result based on result of below cell (row) in separate column
我认为这应该相对容易,但我是个菜鸟!
需要在新的 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
我们可以使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.