Python 滚动柱比较
我想将n列与n-1列进行比较: 数据集: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],
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