Создание оператора IF в Python, который просматривает предыдущий вывод оператора IF

У меня возникают трудности при создании оператора IF, который выполняет следующие действия:

  • Если C1 = купить, то купить
  • Если C2 = Продать, тогда Продать
  • Если C1 и C2 = nan, то текущая ячейка = предыдущая ячейка

Пожалуйста, посмотрите пример ниже. Я надеюсь создать столбец типа "C3".

Образец набора данных:

index  C1    C2
0      Buy   nan
1      nan   nan
2      nan   Sell
3      nan   nan
4      Buy   nan
5      nan   Sell
6      nan   Sell
7      nan   nan
8      nan   nan
9      Buy   nan
10     nan   Sell

Выход:

index  C1    C2    C3
0      Buy   nan   Buy
1      nan   nan   Buy
2      nan   Sell  Sell
3      nan   nan   Sell
4      Buy   nan   Buy
5      nan   Sell  Sell
6      nan   Sell  Sell
7      nan   nan   Sell
8      nan   nan   Sell
9      Buy   nan   Buy
10     nan   Sell  Sell

3 ответа

Решение

Ты можешь использовать pd.DataFrame.ffill вместе axis=1 с последующим pd.Series.ffill:

df['C3'] = df[['C1', 'C2']].ffill(axis=1).iloc[:, -1].ffill()

print(df)

    index   C1    C2    C3
0       0  Buy   NaN   Buy
1       1  NaN   NaN   Buy
2       2  NaN  Sell  Sell
3       3  NaN   NaN  Sell
4       4  Buy   NaN   Buy
5       5  NaN  Sell  Sell
6       6  NaN  Sell  Sell
7       7  NaN   NaN  Sell
8       8  NaN   NaN  Sell
9       9  Buy   NaN   Buy
10     10  NaN  Sell  Sell

Вместо того, чтобы делать предыдущий оператор if, вы можете просто посмотреть, что было ранее помещено в c3 list (так как это результат предыдущего оператора if).

Вот пример того, как вы можете достичь этого в Python:

c1 = ["Buy", "nan", "nan", "nan", "Buy", "nan", "nan", "nan", "nan", "Buy", "nan"]
c2 = ["nan", "nan", "Sell", "nan", "nan", "Sell", "Sell", "nan", "nan", "nan", "Sell"]

c3 = []
for index in range(len(c1)):
    if c1[index] == "Buy":
        c3.append("Buy")
    elif c2[index] == "Sell":
        c3.append("Sell")
    elif c1[index] == "nan" and c2[index] == "nan": # Implied if reached this point (so else would also suffice here)
        c3.append(c3[index-1]) # look at previous result in list
print(c3)

Выход:

['Buy', 'Buy', 'Sell', 'Sell', 'Buy', 'Sell', 'Sell', 'Sell', 'Sell', 'Buy', 'Sell']

Вот простой способ сделать это с помощью Pandas: поменяйте местами все NaN для пустых строк и вернуть любое строковое значение в каждой строке. Если строка пуста, вернуть то, что было до нее.

import pandas as pd

def decide(data):
    if len(data.sum()):
        return data.sum()
    return decide(df.iloc[data.name - 1])

df.fillna("", inplace=True)
df.apply(decide, axis=1)

Выход:

index
0      Buy
1      Buy
2     Sell
3     Sell
4      Buy
5     Sell
6     Sell
7     Sell
8     Sell
9      Buy
10    Sell
dtype: object

Примечание: сделав пару предположений здесь. Во-первых, предполагая только Buy или же Sell происходит подряд. Во-вторых, если предположить, что первая строка не пуста.

Данные:

df = pd.read_clipboard(index_col="index") # copied from OP
Другие вопросы по тегам