熊猫-检查每行的多列中是否存在值

时间:2019-06-24 15:00:17

标签: python pandas conditional-statements

我有以下Pandas数据框:

Index  Name  ID1  ID2  ID3
    1  A     Y    Y    Y
    2  B     Y    Y        
    3  B     Y              
    4  C               Y

我希望添加一个新列“ Multiple”,以指示那些在ID1,ID2和ID3列中不止一个的值Y的行。

Index  Name  ID1  ID2  ID3 Multiple
    1  A     Y    Y    Y   Y
    2  B     Y    Y        Y
    3  B     Y             N
    4  C               Y   N

我通常会使用np.wherenp.select例如:

df['multiple'] = np.where(<More than 1 of ID1, ID2 or ID3 have a Y in>), 'Y', 'N')

但是我不知道如何写条件语句。 ID列的数量可能会越来越多,因此我无法将每种组合作为一个单独的条件来覆盖(例如(ID1 = Y and ID3 = Y) or (ID2 = Y and ID3 = Y)。我想我可能想要一些可以在命名列中计算Y值的东西吗?

在Pandas之外,我会考虑使用一个列表,将Y的每一列的值附加到其中,然后查看列表的长度是否大于1。

但是我无法考虑如何在np.wherenp.selectdf.loc的限制范围内进行操作。 有指针吗?

2 个答案:

答案 0 :(得分:1)

使用numpy逐行求和Y的出现:

df['multi'] = ['Y' if x > 1 else 'N' for x in np.sum(df.values == 'Y', 1)]

输出:

      Name ID1   ID2   ID3 multi
Index                           
1        A   Y     Y     Y     Y
2        B   Y     Y  None     Y
3        B   Y  None  None     N
4        C   Y  None  None     N

答案 1 :(得分:0)

我会这样:

获取要检查的列的列表。

    cols = [x for x in testdf.columns if "id" in x]

如果需要的话,可以在DataFrame上使用filter方法,但是我认为显式选择列列表更加清晰,并且您可以完全灵活地稍后更改条件。

在那之后,就是:

    testdf["multiple"] = (testdf[cols]=="Y").any(axis="columns")

说明:

  • testdf[cols]返回仅由您在第一行中选择的列组成的DataFrame。
  • testdf[cols]=="Y"返回根据条件“ == Y”填充为True或False的DataFrame。
  • ()。any(axis =“ columns”)扫描此DataFrame的列,对于每一行,如果该行中的任何项目为True,则返回True,否则返回False。

如果您确实需要,可以将True值更改为“ Y”,将False值更改为“ N”。