Python Pandas:如何比较单元格和两列的值,并可能使用 If...Else 语句创建具有新值的另一列
Python Pandas: How to compare values of cells and two columns and maybe using If...Else statement to create another column with new values
我正在尝试和研究如何做到这一点,但我无法将 pandas 与 if, else 混合使用 and/or 通过索引获取值并将其与 if, else 进行比较并用 codes/values 分配一列。
说明:我下面有这个table,我想比较ID列的单元格,如果后单元格的值等于前一个单元格的值AND 如果在 COD 列中后单元等于前一个单元,THEN 结果列 = "否" , 否则 "pass" 如果两者都不是 "unknown"
这是我在 excel 中制作的公式:=IF(B3=B2,IF(C3=C2,"NO","PASS"),"UNKNOWN").
下面我也贴出了一些代码尝试。我什至可以用第一个测试(来自 ID 列单元格)和第二个测试(来自 COD 列单元格)和布尔结果 return 创建两列,但我无法得到 If, Else 到将它们连接在一起并在另一列中生成我想要的值。
如果有人能帮助我,我会很感激吗?
df = df.sort_values(by=['ID'])
df['matchesID'] = df['ID'].shift(1) == df['ID']
df['matchesCod']= df['Cod'].shift(1) == df['Cod']
或
df = df.sort_values(by=['ID'])
test = (df['SWENo'].shift(1) == df['SWENo']) & (df['Cod'].shift(1) == df['Cod'])
我正在尝试下面这样的事情
if df['ID'].shift(1) == df['ID'] and df['Cod'].shift(1) == df['Cod']:
listProg.append('not')
elif df['ID'].shift(1) == df['ID'] and df['Cod'].shift(1) != df['Cod']:
listProg.append('pass')
else:
listProg.append('Unknown')
但结果是:“ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any () 或 a.all()".
如果你能帮我,我很感激,它可以与pandas或不混合。我只需要它工作。谢谢大家。
pandas 中的类似方法是使用 numpy.where
函数。
使用此代码:
import numpy as np
df['Result'] = np.where(df['ID'] == df['ID'].shift(), np.where(df['Cod'] == df['Cod'].shift(), 'NO', 'PASS'), 'UNKNOWN')
我得到以下结果:
ID Cod Result
0 1 1 UNKNOWN
1 2 1 UNKNOWN
2 2 1 NO
3 3 1 UNKNOWN
4 4 1 UNKNOWN
5 4 2 PASS
6 4 2 NO
7 5 1 UNKNOWN
8 6 1 UNKNOWN
这似乎更符合您对如何导出结果值的描述。
我正在尝试和研究如何做到这一点,但我无法将 pandas 与 if, else 混合使用 and/or 通过索引获取值并将其与 if, else 进行比较并用 codes/values 分配一列。 说明:我下面有这个table,我想比较ID列的单元格,如果后单元格的值等于前一个单元格的值AND 如果在 COD 列中后单元等于前一个单元,THEN 结果列 = "否" , 否则 "pass" 如果两者都不是 "unknown"
这是我在 excel 中制作的公式:=IF(B3=B2,IF(C3=C2,"NO","PASS"),"UNKNOWN").
下面我也贴出了一些代码尝试。我什至可以用第一个测试(来自 ID 列单元格)和第二个测试(来自 COD 列单元格)和布尔结果 return 创建两列,但我无法得到 If, Else 到将它们连接在一起并在另一列中生成我想要的值。 如果有人能帮助我,我会很感激吗?
df = df.sort_values(by=['ID'])
df['matchesID'] = df['ID'].shift(1) == df['ID']
df['matchesCod']= df['Cod'].shift(1) == df['Cod']
或
df = df.sort_values(by=['ID'])
test = (df['SWENo'].shift(1) == df['SWENo']) & (df['Cod'].shift(1) == df['Cod'])
我正在尝试下面这样的事情
if df['ID'].shift(1) == df['ID'] and df['Cod'].shift(1) == df['Cod']:
listProg.append('not')
elif df['ID'].shift(1) == df['ID'] and df['Cod'].shift(1) != df['Cod']:
listProg.append('pass')
else:
listProg.append('Unknown')
但结果是:“ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any () 或 a.all()".
如果你能帮我,我很感激,它可以与pandas或不混合。我只需要它工作。谢谢大家。
pandas 中的类似方法是使用 numpy.where
函数。
使用此代码:
import numpy as np
df['Result'] = np.where(df['ID'] == df['ID'].shift(), np.where(df['Cod'] == df['Cod'].shift(), 'NO', 'PASS'), 'UNKNOWN')
我得到以下结果:
ID Cod Result
0 1 1 UNKNOWN
1 2 1 UNKNOWN
2 2 1 NO
3 3 1 UNKNOWN
4 4 1 UNKNOWN
5 4 2 PASS
6 4 2 NO
7 5 1 UNKNOWN
8 6 1 UNKNOWN
这似乎更符合您对如何导出结果值的描述。