首页 > 解决方案 > 根据先前列中满足的某些条件在数据框中创建新列

问题描述

我想根据某个值是否接踵而至,在数据框中创建一个新列。示例我的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

如果有人从前几个月的“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

本质上,我想要一个不需要每个月都更新的代码,并且可以只使用列索引来返回值。

标签: pythondataframe

解决方案


与右移的相同数据帧进行比较。由于 '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)

推荐阅读