根据先前列中满足的某些条件在数据框中创建新列

时间:2019-10-18 14:54:00

标签: python dataframe

我想根据某个值是否接连出现在数据框中创建新列。我的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

基本上,我想要一个不需要每月更新的代码,而只需使用列索引即可返回值。

1 个答案:

答案 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)