Python 滚动柱比较

Python 滚动柱比较,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我想将n列与n-1列进行比较: 数据集: data = {"Week_1": [np.nan,1,0,0,0,np.nan], "Week_2": [0,0,0,1,1,0], "Week_3": [0,0,1,1,1,np.nan], "Week_4": [0,0,1,1,0,1], "Week_5": [0,1,0,0,1,0],

我想将n列与n-1列进行比较:

数据集:

data = {"Week_1": [np.nan,1,0,0,0,np.nan],
        "Week_2": [0,0,0,1,1,0],
        "Week_3": [0,0,1,1,1,np.nan],
        "Week_4": [0,0,1,1,0,1],
        "Week_5": [0,1,0,0,1,0],
       }

idx = ["Employee_1", "Employee_2", "Employee_3", "Employee_4", "Employee_5", "Employee_6"]

data = pd.DataFrame(data,
                    index=idx
                   )
它看起来像什么:

            Week_1  Week_2  Week_3  Week_4  Week_5
Employee_1  NaN     0       0.0     0       0
Employee_2  1.0     0       0.0     0       1
Employee_3  0.0     0       1.0     1       0
Employee_4  0.0     1       1.0     1       0
Employee_5  0.0     1       1.0     0       1
Employee_6  NaN     0       NaN     1       0
我期望得到的是:

            Week_1  Week_2          Week_3          Week_4          Week_5
Employee_1  NaN     Not Applicable  Same            Same            Same
Employee_2  NaN     Regress         Same            Same            Improve
Employee_3  NaN     Same            Improve         Same            Regress
Employee_4  NaN     Improve         Same            Same            Regress
Employee_5  NaN     Improve         Same            Regress         Improve
Employee_6  NaN     Not Applicable  Not Applicable  Not Applicable  Regress
我的代码是什么样子的:

            Week_1  Week_2  Week_3  Week_4  Week_5
Employee_1  NaN     0       0.0     0       0
Employee_2  1.0     0       0.0     0       1
Employee_3  0.0     0       1.0     1       0
Employee_4  0.0     1       1.0     1       0
Employee_5  0.0     1       1.0     0       1
Employee_6  NaN     0       NaN     1       0
功能:

def compare(val):
    
     conditions = [val[0] > val[1],
                   val[0] < val[1],
                   val[0] == val[1],
                   np.nan in val
                  ]

     choices = ["Improve", "Regress", "Same", "Not Applicable"]

     return np.select(conditions, choices, np.nan)
第二次尝试:

data.rolling(2, axis=1).apply(lambda x: compare(x))

将n列与n-1列进行比较仅意味着轴=1的差异:


将n列与n-1列进行比较仅意味着轴=1的差异:


下面是如何更改函数比较和传递数据差异的方法


下面是如何更改函数比较和传递数据差异的方法


原始值总是为0,1,和南,或者你可以有更多的值?@ Ben。T,你可以有更多的价值。这也是我从我所做的函数考虑的。谢谢你说原始值永远是0,1和南,或者你可以有更多的价值?你可以有更多的价值……这也是我从我所做的功能考虑的。谢谢AgHeldHelry,这真的从例子中解决了这个问题。但你能提供一个替代方案吗?假设值的范围为1-10?与1s和0shello henry不同,这确实解决了基于示例的问题。但你能提供一个替代方案吗?假设值的范围为1-10?而不是1和0
s = data.diff(axis=1)

data.loc[:] = np.select([s>=1, s==0, s<0], ["Increase","Same","Regress"], "Not Applicable")

print (data)

                    Week_1          Week_2          Week_3          Week_4    Week_5
Employee_1  Not Applicable  Not Applicable            Same            Same      Same
Employee_2  Not Applicable         Regress            Same            Same  Increase
Employee_3  Not Applicable            Same        Increase            Same   Regress
Employee_4  Not Applicable        Increase            Same            Same   Regress
Employee_5  Not Applicable        Increase            Same         Regress  Increase
Employee_6  Not Applicable  Not Applicable  Not Applicable  Not Applicable   Regress
def compare(df_):
    
     conditions = [df_>0, df_<0, df_==0]

     choices = ["Improve", "Regress", "Same"]

     return pd.DataFrame(np.select(conditions, choices, "Not Applicable"), 
                         index=df_.index, columns=df_.columns)

res = compare(data.diff(axis=1))

print(res)
                    Week_1          Week_2          Week_3          Week_4  \
Employee_1  Not Applicable  Not Applicable            Same            Same   
Employee_2  Not Applicable         Regress            Same            Same   
Employee_3  Not Applicable            Same         Improve            Same   
Employee_4  Not Applicable         Improve         Regress            Same   
Employee_5  Not Applicable         Improve            Same         Regress   
Employee_6  Not Applicable  Not Applicable  Not Applicable  Not Applicable   

             Week_5  
Employee_1     Same  
Employee_2  Improve  
Employee_3  Regress  
Employee_4  Regress  
Employee_5  Improve  
Employee_6  Regress