pandas - 根据其他列的值生成新列

标签 pandas

这是我的示例数据输入和输出:

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"]=  

我不知道如何为第二种和第三种情况对列进行子集化。

最佳答案

假设标志和值列的顺序匹配,您可以先过滤像列一样的标志和值,然后屏蔽中的值flag0 的列,然后沿 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/

相关文章:

python - 分割一个数据帧,然后将它们保存到python中的两个单独的dfs中

python - 如何逐行计算两列 Pandas 中的 pct_change()?

Python - 使用 Ipyvolume 库在 x、y 和 z 轴上绘制不同颜色的问题

python - 按索引系列索引 Pandas DataFrame/Series

python - Pandas :过滤计数小于指定值的数据透视表行

python - 加快对 pandas 系列的异常值检查

pandas - 将 Pandas 数据帧转换为具有多个键的字典

python - 计算列表中具有相同值的子列表

excel - python pandas to_excel设置单元格背景颜色

pandas - Groupby 转换到 Pandas 中的列表不起作用