Создание оператора 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