我在创建执行以下操作的IF语句时遇到困难:
请参见下面的示例。我希望创建一个像“ 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
答案 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
注意:在此进行一些假设。首先,假设连续仅出现Buy
或Sell
。第二,假设第一行不为空。
数据:
df = pd.read_clipboard(index_col="index") # copied from OP
答案 2 :(得分:1)
您可以在axis=1
和pd.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