这是我的示例数据输入和输出:
df=pd.DataFrame({'A_flag': [1, 1,1], 'B_flag': [1, 1,0],'C_flag': [0, 1,0],'A_value': [5, 3,7], 'B_value': [2, 7,4],'C_value': [4, 2,5]})
df1=pd.DataFrame({'A_flag': [1, 1,1], 'B_flag': [1, 1,0],'C_flag': [0, 1,0],'A_value': [5, 3,7], 'B_value': [2, 7,4],'C_value': [4, 2,5], 'Final':[3.5,3,7]})
我想根据 A_flag、B_flag 和 C_flag 生成另一个名为“Final”的列:
(a) 如果等于 1 的三列数为 3,则 'Final'=(A_value, B_value, C_value) 的中值
(b) 如果满足条件的数量为 2,则“最终”= 这两个条件的平均值
(c) 如果数字是 1,则 'Final' = 那个
例如第1行,A_flag=1 and B_flag =1, 'Final'=A_value+B_value/2=5+2/2=3.5 在第 2 行中,所有三个标志均为 1,因此“最终”= (3,7,2) 的中位数 =3 在第 3 行中,只有 A_flag=1,所以 'Final'=A_value=7
我尝试了以下方法:
df.loc[df[['A_flag','B_flag','C_flag']].eq(1).sum(axis=1)==3, "Final"]= df[['A_flag','B_flag','C_flag']].median(axis=1)
df.loc[df[['A_flag','B_flag','C_flag']].eq(1).sum(axis=1)==2, "Final"]=
df.loc[df[['A_flag','B_flag','C_flag']].eq(1).sum(axis=1)==1, "Final"]=
我不知道如何为第二种和第三种情况对列进行子集化。
最佳答案
假设标志和值列的顺序匹配,您可以先过滤
像列一样的标志和值,然后屏蔽
值
中的值flag
为 0
的列,然后沿 axis=1
median
flag = df.filter(like='_flag')
value = df.filter(like='_value')
df['median'] = value.mask(flag.eq(0).to_numpy()).median(1)
A_flag B_flag C_flag A_value B_value C_value median
0 1 1 0 5 2 4 3.5
1 1 1 1 3 7 2 3.0
2 1 0 0 7 4 5 7.0
关于pandas - 根据其他列的值生成新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73692792/