比较 arraysize 不相等的数据帧的相邻列

Compare adjacent column of a dataframe where arraysize is not equal

提问人:Priyanka Kumari 提问时间:5/31/2023 最后编辑:petezurichPriyanka Kumari 更新时间:5/31/2023 访问量:35

问:

import pandas as pd

import numpy as np

df =pd.DataFrame({

'ID1': \['1', '2', '2', '3','4','4', '5', '6', '6', '6', '7'\],

'ID2':\['a', 'a','b', 'a', 'a', 'b', 'a','a', 'b','c','a'\],

'AMT1':\['1',2', '3', '4', '5','6', np.nan, np.nan, np.nan, np.nan, np.nan\],

'AMT 2': \['1', '3', '3', '4', '6', '7', '1', '2', '3','4', '5'\],

'SAL1':\['100','200','300','400, '500', '600', np.nan, np.nan, np.nan, np.nan, np.nan\],

'SAL_2': \['100', '200', '300', '400', '600', '500, 100, 200, 300, 400', '500'\],

'NAME 3': \['A1', 'A2', 'A3, A4, A5, A6, np.nan, np.nan, np.nan, np.nan, np.nan\],

'NAME_4': \['A1', 'A2', 'A3', 'A4', 'A6', 'A7, np.nan, np.nan, np.nan, np.nan, np.nan\],

EMAIL 3': \['E1', 'E2', 'E3', 'E4', 'E5', 'E6', np.nan, np.nan, np.nan, np.nan, np.nan\],

' EMAIL 4': \['E1', 'E3', 'E3', 'E4', 'E7', 'E8', np.nan, np.nan, np.nan, np.nan

})

上面的数据帧我正在使用,我想比较

每隔一列的相邻列,并相应地设置状态。

  1. 如果每对相邻的列都匹配,则 Status 应为 PASS

  2. 如果任何相邻的列对不匹配,则 Status 应为 fail

  3. 如果其中至少有一个为空或 null,则也失败

方法1:

Cond1= np.all(df.filter(like="\_\*1").tonumpy()== df.filter(like="2").to\_\*numpy(), axis=1)

Cond2= np.all(df.filter(like="*3").to*numpy()== df.filter(like="2").to_numpy(), axis=1)

df\["Status"\] = np.where(cond1 & cond2, "Pass","Fail")

使用方法 1 m 后,得到误差轴 1 对于维度为 0 的数组是越界的

方法2:

df\["Status"\] = df.iloc\[:,2:\].apply(lambda x: 'Pass' if x\[0\] == x\[1\] else 'Fail' , axis =1)

同样的错误,我也得到了我正在使用的数据帧只是一个小例子。

谁能帮我做错的地方

Python Pandas 数据帧 比较

评论


答:

1赞 Pablo Basa 5/31/2023 #1

您的代码存在一些问题。下面是一个更正后的版本:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'ID1': ['1', '2', '2', '3', '4', '4', '5', '6', '6', '6', '7'],
    'ID2': ['a', 'a', 'b', 'a', 'a', 'b', 'a', 'a', 'b', 'c', 'a'],
    'AMT1': ['1', '2', '3', '4', '5', '6', np.nan, np.nan, np.nan, np.nan, np.nan],
    'AMT2': ['1', '3', '3', '4', '6', '7', '1', '2', '3', '4', '5'],
    'SAL1': ['100', '200', '300', '400', '500', '600', np.nan, np.nan, np.nan, np.nan, np.nan],
    'SAL2': ['100', '200', '300', '400', '600', '500', '100', '200', '300', '400', '500'],
    'NAME3': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', np.nan, np.nan, np.nan, np.nan, np.nan],
    'NAME4': ['A1', 'A2', 'A3', 'A4', 'A6', 'A7', np.nan, np.nan, np.nan, np.nan, np.nan],
    'EMAIL3': ['E1', 'E2', 'E3', 'E4', 'E5', 'E6', np.nan, np.nan, np.nan, np.nan, np.nan],
    'EMAIL4': ['E1', 'E3', 'E3', 'E4', 'E7', 'E8', np.nan, np.nan, np.nan, np.nan, np.nan]
})

status_cols = [col for col in df.columns if col.endswith(('1', '2', '3', '4'))]
status = np.where(df[status_cols].nunique(axis=1) == 1, "Pass", "Fail")
df["Status"] = np.where(df[status_cols].isnull().any(axis=1), "Fail", status)

这是我更改的内容:

  • 更正了 DataFrame 定义中的列名。示例中的列名有空格和不一致的间距。
  • 创建了一个列表status_cols来存储要比较相邻列的列名。
  • 使用 axis=1 的 nunique() 方法来检查所有相邻列是否具有相同的值。如果这样做,则返回 1,表示“通过”。否则,它将返回一个大于 1 的值,指示 “失败”。
  • 添加了使用 isnull().any(axis=1) 的额外检查,以查看任何相邻列是否为 null 或 NaN。如果是这样,则“状态”设置为“失败”。
  • 使用 np.where() 合并这两个检查以相应地分配“状态”列。

现在,代码应该可以正常工作,并根据您指定的条件分配“通过”或“失败”状态。