如何创建将一列的多行与另一列进行比较的更有效的布尔逻辑代码?

时间:2019-04-04 13:16:12

标签: python python-3.x pandas numpy

我想要一种有效且通用的方法,根据一列的多行与其他列的多行进行比较,在数据框中创建新的布尔列。所谓的多行,是指一列的当前行以及该列的一个或多个滞后(即df ['column']。shift(1)。现在,我为数据帧中的每一列创建一个逻辑比较。)在下面的示例中,我只有3列。我希望有一种方法可以使用any()或all()在可能要检查50列的情况下创建更有效的逻辑比较。

我已经通过为每个列编写详细条件并将条件放置在np.where()语句中来成功创建该列。如果我必须检查50列,这种方法将行不通。

此代码产生原始数据帧:

import numpy as np
import pandas as pd
df = pd.DataFrame({'C1':[3,2,8,6,6,7,8],'C2':[5,4,6,4,8,3,2],'C3': [5,4,6,7,8,6,4],
                   'Year':[2012,2013,2014,2015,2016,2017,2018]})
df.set_index('Year', inplace=True)
df1 =df[::-1]
df1

对于我给出的示例,我试图创建“成功”列,如果cany列为8,而其下方的列(上一年)小于8,则此列为1。这是我到目前为止所做的:

Criteria_1 = ( (df1['C1']==8) & (df1['C1'] > df1['C1'].shift(-1) ) |
               (df1['C2']==8) & (df1['C2'] > df1['C2'].shift(-1) )|
               (df1['C3']==8) & (df1['C3'] > df1['C3'].shift(-1) )
              )
df1['Sucess']=np.where(Criteria_1,1,0)

我希望看到与上面的代码产生的输出相同的输出,但是可能使用any()获得更多简洁的代码,以便我可以说是否有任何列满足上述条件,则成功应该等于1。enter image description here < / p>

1 个答案:

答案 0 :(得分:4)

可能类似于:

df1 =df[::-1].copy()
df1['Success']=(df1.eq(8)&df1.gt(df1.shift(-1))).any(axis=1).astype(int)
print(df1)

      C1  C2  C3  Success
Year                     
2018   8   2   4        1
2017   7   3   6        0
2016   6   8   8        1
2015   6   4   7        0
2014   8   6   6        1
2013   2   4   4        0
2012   3   5   5        0