我想要一种有效且通用的方法,根据一列的多行与其他列的多行进行比较,在数据框中创建新的布尔列。所谓的多行,是指一列的当前行以及该列的一个或多个滞后(即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。 < / p>
答案 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