数据框:
data=pd.DataFrame({'name':['A','B','C'],
'rank':[np.nan,2,3],
'rank1':[2,np.nan,2],
'rank2':[3,1,np.nan],
'rank4':[4,2,3]})
我的代码:
data['Diff']=np.where((data['rank']<data['rank1'])&(data['rank1']<data['rank2'])&(data['rank2']<data['rank4']),1,0)
要求忽略空值并比较其余的数值希望A的差异为1(如果排名不断增加忽略空值)
答案 0 :(得分:5)
我们可以filter
rank
之类的列,然后在 axis=1
上向前填充以传播最后一个有效值,然后沿 diff
计算 axis=1
以检查单调性
r = df.filter(like='rank')
data['diff'] = r.ffill(1).diff(axis=1).fillna(0).ge(0).all(1)
name rank rank1 rank2 rank4 diff
0 A NaN 2.0 3.0 4 True
1 B 2.0 NaN 1.0 2 False
2 C 3.0 2.0 NaN 3 False
答案 1 :(得分:2)
您可以先使用 dropna
,然后使用 is_monotonic
。
df['Diff'] = df.set_index('name').apply(lambda x: int(x.dropna().is_monotonic), 1)
或者您可以使用它来更具体地了解差异。
df = df.set_index('name').apply(lambda x: int(all(x.dropna().diff().fillna(1).eq(1))), 1)