результат столбца панд, основанный на результате ниже ячейки (строки) в отдельном столбце - PullRequest
2 голосов
/ 05 мая 2019

Я думаю, это должно быть относительно легко, но я нуб!

Необходимо вернуть результаты в новом столбце панд (вызов этого столбца 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' всегда должны быть отражены как ячейки 'HODL' в столбце B

Если бы ячейка 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)

1 Ответ

1 голос
/ 05 мая 2019

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
...