熊猫列结果基于单独列中以下单元格(行)的结果

时间:2019-05-05 12:28:47

标签: python pandas dataframe loc

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

需要在新的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)

1 个答案:

答案 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