我想根据某个值是否接连出现在数据框中创建新列。我的df示例如下:
编辑:(值可以包含(A,N,E,V))
Name Jan Feb Mar April
John N N E E
Alex E E E E
Alice E E E N
我希望有一个新的列“ designation”,如果有人将前几个月的“ N”值更改为“ E”,则返回1,如果有其他更改,则返回0。本质上,此数据框来自每个月更新的excel文件,因此最近的月份将显示在最后一列中。
我有一个密码
def func(u,x,y,z):
if u =='N' and x== 'E':
return 1
elif x =='N' and y == 'E':
return 1
elif y =='N' and z == 'E':
return 1
else:
return 0
基本上,我想要一个不需要每月更新的代码,而只需使用列索引即可返回值。
答案 0 :(得分:2)
与相同的数据帧右移比较。由于'N'>'E',强制转换为int会生成您想要的
>>> df = pd.DataFrame({'Jan': list('NEE'), 'Feb': list('NEE'), 'Mar': 'E', 'April': list('EEN')})
>>> df
Jan Feb Mar April
0 N N E E
1 E E E E
2 E E E N
>>> (df < df.shift(1, axis=1)).astype(int)
Jan Feb Mar April
0 0 0 1 0
1 0 0 0 0
2 0 0 0 0
如果只想对最后一列做同样的事情,只需
(df.iloc[:, -1] < df.iloc[:, -2]).astype(int)
UPD::如果还有其他字母,则应为:
(( df.shift(1, axis=1) == 'N') & (df == 'E')).astype(int)
或者,对于单个列:
((df.iloc[:, -2] == 'N') & (df.iloc[:, -1] == 'E')).astype(int)