我想在我的数据框中创建一个新列,如果只有该列在相应行中的值为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]})
答案 0 :(得分:3)
很酷的问题。
df==8
(df==8).sum(axis=1)
(df==8).sum(axis=1)==1
df[(df==8).sum(axis=1)==1]==8
df[(df==8).sum(axis=1)==1]==8)
True
查找包含idxmax
值的列(因为True>False
):(df[(df==8).sum(axis=1)==1]==8).idxmax(axis=1)
"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