我正在尝试使用此数据帧执行条件逻辑。
In[5]: df = pd.DataFrame({'WINNER': [2, 2, 0], 'PREDICTED': [2, 1, 0], 'HOME': [5.25, 2.2, 1.25], 'DRAW': [4.5, 3.2, 5], 'AWAY': [1.53, 3.4, 8]})
In[6]: df
Out[6]:
AWAY DRAW HOME PREDICTED WINNER
0 1.53 4.5 5.25 2 2
1 3.40 3.2 2.20 1 2
2 8.00 5.0 1.25 0 0
使用以下规则,我想计算一个新的profit
列。
In[14]: df.loc[(df["WINNER"] == df["PREDICTED"]) & (df["PREDICTED"] == 0), "PROFIT"] = df['HOME'] * 10
In[16]: df.loc[(df["WINNER"] == df["PREDICTED"]) & (df["PREDICTED"] == 1), "PROFIT"] = df['DRAW'] * 10
In[17]: df.loc[(df["WINNER"] == df["PREDICTED"]) & (df["PREDICTED"] == 2), "PROFIT"] = df['AWAY'] * 10
我几乎得到了正确的结果:
AWAY DRAW HOME PREDICTED WINNER PROFIT
0 1.53 4.5 5.25 2 2 15.3
1 3.40 3.2 2.20 1 2 NaN
2 8.00 5.0 1.25 0 0 12.5
是否可以简化第14-17行中的代码?
如何获得以下表格,使NaN => -10吗
AWAY DRAW HOME PREDICTED WINNER PROFIT
0 1.53 4.5 5.25 2 2 15.3
1 3.40 3.2 2.20 1 2 -10
2 8.00 5.0 1.25 0 0 12.5
编辑:我喜欢imp9
解决方案提出的一点点修改
categories = ['HOME', 'DRAW', 'AWAY']
df['PROFIT'] = -10
for count, col in enumerate(categories):
df.loc[df.query('WINNER == PREDICTED == @count').index, "PROFIT"] += df[col] * 10
答案 0 :(得分:2)
categories = ['HOME', 'DRAW', 'AWAY']
for count, col in enumerate(categories):
df.loc[df.query('WINNER == PREDICTED == @count').index, "PROFIT"] = df[col] * 10
df.fillna({'PROFIT': -10}, inplace = True)
df.query
进一步简化条件逻辑的编写。查询必须作为字符串传递,变量应以@
开头。df.fillna()
可让您替换数据框中的所有NaN值。 编辑:使用字典,因此PROFIT
列中只有Nan填充。
答案 1 :(得分:1)
考虑numpy的np.where()来反映嵌套的if / then / else。错误的论点是-10:
df["PROFIT"] = np.where((df["WINNER"] == df["PREDICTED"]) & (df["PREDICTED"] == 0),
df['HOME'] * 10,
np.where((df["WINNER"] == df["PREDICTED"]) & (df["PREDICTED"] == 1),
df['DRAW'] * 10,
np.where((df["WINNER"] == df["PREDICTED"]) & (df["PREDICTED"] == 2),
df['AWAY'] * 10, -10)))