我有以下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.where
或np.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.where
,np.select
或df.loc
的限制范围内进行操作。
有指针吗?
答案 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。如果您确实需要,可以将True值更改为“ Y”,将False值更改为“ N”。