检查熊猫中的多列条件

时间:2018-11-05 02:06:33

标签: python pandas

我想在我的数据框中创建一个新列,如果只有该列在相应行中的值为8,则将该列的名称放置在行中,否则该行的新列的值为“ NONE” 。对于数据框df,新列df["New_Column"] = ["NONE","NONE","A","NONE"]

df = pd.DataFrame({"A": [1, 2,8,3], "B": [0, 2,4,8], "C": [0, 0,7,8]})

3 个答案:

答案 0 :(得分:3)

很酷的问题。

  1. 在每行中找到8个字段:df==8
  2. 算一下:(df==8).sum(axis=1)
  3. 找到计数为1的行:(df==8).sum(axis=1)==1
  4. 仅从原始数据框中选择以下行:df[(df==8).sum(axis=1)==1]==8
  5. 再次查找8个字段:df[(df==8).sum(axis=1)==1]==8)
  6. True查找包含idxmax值的列(因为True>False):(df[(df==8).sum(axis=1)==1]==8).idxmax(axis=1)
  7. "NONE"填补空白

总结:

df["New_Column"] = (df[(df==8).sum(axis=1)==1]==8).idxmax(axis=1)
df["New_Column"] = df["New_Column"].fillna("NONE")
#   A  B  C New_Column
#0  1  0  0       NONE
#1  2  2  0       NONE
#2  8  4  7          A
#3  3  8  8       NONE
# I added another line as a proof of concept
#4  0  8  0          B

答案 1 :(得分:1)

您可以使用idxmax和遮罩来完成此操作:

out = (df==8).idxmax(1)
m = ~(df==8).any(1) | ((df==8).sum(1) > 1)

df.assign(col=out.mask(m))

   A  B  C  col
0  1  0  0  NaN
1  2  2  0  NaN
2  8  4  7    A
3  3  8  8  NaN

答案 2 :(得分:1)

或者这样做:

df2=df[(df==8)]
df['New_Column']=(df2[(df2!=df2.dropna(thresh=2).values[0]).all(1)].dropna(how='all')).idxmax(1)
df['New_Column'] = df['New_Column'].fillna('NONE')
print(df)

dropna + dropna + idxmax + fillna。这就是您所需要的。

输出:

   A  B  C New_Column
0  1  0  0       NONE
1  2  2  0       NONE
2  8  4  7          A
3  3  8  8       NONE