评估pandas中的多个复杂条件语句

时间:2016-01-04 23:56:54

标签: python python-2.7 pandas

我正在尝试使用此数据帧执行条件逻辑。

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

2 个答案:

答案 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)
  • 使用带有enumerate的for循环逐步填写利润列。
  • 使用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)))