Pythonic方法简化了2个pandas列与条件的乘法

时间:2016-01-21 08:51:43

标签: python python-2.7 numpy pandas

我正在寻找一种方法来简化以下示例:

self.df[TARGET_NAME] = self.df.apply(lambda row: 1 if row['WINNER'] == 1 and row['WINNER_OVER_2_5'] == 1 else 0, axis=1)

喜欢:

  

self.df [TARGET_NAME] = self.df [(self.df.WINNER == 1)]&   self.df [(self.df.WINNER_OVER_2_5 == 1)]#不是不正确

更复杂如下

df["PROFIT"] = np.where((df[TARGET_NAME] == df["PREDICTED"]) & (df["PREDICTED"] == 0),
                                  df['MATCH_HOME'] * df['HOME_STAKE'],
                                  np.where((dfml[TARGET_NAME] == df["PREDICTED"]) & (df["PREDICTED"] == 1),
                                           df['MATCH_DRAW'] * df['DRAW_STAKE'],
                                           np.where((df[TARGET_NAME] == df["PREDICTED"]) & (df["PREDICTED"] == 2),
                                                    df['MATCH_AWAY'] * df['AWAY_STAKE'],
                                                    -0))).astype(float)

3 个答案:

答案 0 :(得分:1)

IIUC你可以使用isin

print df
   WINNER  WINNER_OVER_2_5
0       1                0
1       1                1
2       0                2

df['TARGET_NAME'] = np.where((df.WINNER.isin([1]) & df.WINNER_OVER_2_5.isin([1])),1,0)
print df
   WINNER  WINNER_OVER_2_5  TARGET_NAME
0       1                0            0
1       1                1            1
2       0                2            0

编辑(未经测试,因为没有数据):

df["PROFIT"] = np.where((df[TARGET_NAME] == df["PREDICTED"]) & (df["PREDICTED"].isin([0])),
                                  df['MATCH_HOME'] * df['HOME_STAKE'],
                                  np.where((dfml[TARGET_NAME] == df["PREDICTED"]) & (df["PREDICTED"].isin([1])),
                                           df['MATCH_DRAW'] * df['DRAW_STAKE'],
                                           np.where((df[TARGET_NAME] == df["PREDICTED"]) & (df["PREDICTED"].isin([2])),
                                                    df['MATCH_AWAY'] * df['AWAY_STAKE'],
                                                    0))).astype(float)

答案 1 :(得分:1)

  

我正在寻找一种方法来简化以下示例:

我猜你正在寻找一种更简单的语法。怎么样:

df['MATCH'] = matches(df, values=(0,1), WINNER=1, WINNER_OVER_2_5=1)

请注意,values=是可选的,可以使用tuple(false-value, true-value),默认为(False, True)

要实现这一目标需要一点魔力。本质上,这通过链接条件并将结果转换为指定的值来构建真值表。它最终与您的lambda做同样的事情,只是以通用的方式。

def matches(df, values=None, **kwargs):
    values = values or (False, True)
    flt = None
    for var, value in kwargs.iteritems():
        t = (df[var] == value)
        flt = (flt & t) if flt is not None else t
    flt = flt.apply(lambda t : values[t])
    return flt

答案 2 :(得分:0)

也许您可以尝试使用布尔属性

df= pd.DataFrame({'a':[1,0,1,0],'b' :[1,1,0,np.nan]})

df['NEW']= ((df['a']==1 ) &  (df['b']==1)).astype(int).fillna(0)