在Python中创建一个IF语句,以查看先前的IF语句输出

时间:2018-07-28 14:14:01

标签: python pandas if-statement dataframe trading

我在创建执行以下操作的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 个答案:

答案 0 :(得分:1)

您可以简单地查看先前放入c3列表中的内容,而不是执行前面的if语句(这是前面的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']

答案 1 :(得分:1)

这是使用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

注意:在此进行一些假设。首先,假设连续仅出现BuySell。第二,假设第一行不为空。

数据:

df = pd.read_clipboard(index_col="index") # copied from OP

答案 2 :(得分:1)

您可以在axis=1pd.DataFrame.ffill之后使用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