python - Pandas - 根据其他列中的值计算具有条件的列的平均值

标签 python pandas if-statement iteration

我很难在数据框中创建一个新列,这将是遍历数据框的每一行并根据某些条件计算平均值的结果。 这就是数据框的样子

ID, 1_a, 1_b, 1_c, 2_a, 2_b, 2_c, 3_a, 3_b, 3_c 
0, 0, 145, 0.8, 0, 555, 0.7, 1, 335, 0.7
1, 1, 222, 0.9, 1, 224, 0.4, 1, 555, 0.6
3, 1, 111, 0.3, 0, 222, 0.5, 1, 999, 0.7 

我希望得到以下结果:

ID, 1_a, 1_b, 1_c, 2_a, 2_b, 2_c, 3_a, 3_b, 3_c, NEW
0, 0, 145, 0.8, 0, 555, 0.7, 1, 335, 0.7, 0.7
1, 1, 222, 0.8, 1, 224, 0.4, 1, 555, 0.6, 0.6
3, 1, 111, 0.3, 0, 222, 0.5, 1, 999, 0.7, 0.5

逻辑如下。

If 1_a is 1, keep value in 1_c, if not ignore
If 2_a is 1, keep value in 2_c, if not ignore
If 3_a is 1, keep value in 3_c, if not ignore

计算每行保留值的平均值并存储在“NEW”列中

我尝试了多种方法,但只有当数据框中只有 1 行时它才有效。如果我有超过 1 行,它似乎会计算整个数据帧的平均值。 此外,我尝试优化该函数,因为我有超过 10 个这样的 IF 条件。 这就是我尝试过的,但它没有给我结果,我正在寻找:

 def test(x):
    a = x[x['1_a']==1]['1_c'].values
    b = x[x['2_a']==1]['2_c'].values
    c = x[x['3_a']==1]['3_c'].values
    xx =np.concatenate((a,b,c), axis=0)
    z = sum(xx)/len(xx)
    x['New_Prob'] = z
    return x
print(test(df))

结果是这样的:

ID, 1_a, 1_b, 1_c, 2_a, 2_b, 2_c, 3_a, 3_b, 3_c, NEW
0, 0, 145, 0.8, 0, 555, 0.7, 1, 335, 0.7, 0.6
1, 1, 222, 0.8, 1, 224, 0.4, 1, 555, 0.6, 0.6
3, 1, 111, 0.3, 0, 222, 0.5, 1, 999, 0.7, 0.6

最佳答案

如果您的列的“_a”和“_c”的范围相似,您可以简单地循环它们;

r = range(1,4)
for i in r:
    df.loc[df["{}_a".format(i)] != 1, "{}_c".format(i)] = np.NaN

df['NEW'] = df[['{}_c'.format(i) for i in r]].mean(axis=1)

关于python - Pandas - 根据其他列中的值计算具有条件的列的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55272152/

相关文章:

python改变列表的值

python - 将两个 Pandas 数据帧与仅添加整数计数相结合

python - 从逐笔报价数据到烛台

python - df.to_latex() 的格式

java - 循环遍历ArrayList并仅打印具有特定属性的对象

python - 强化学习中的负奖励

python - Django Createview外键字段的默认值

c++ - 'if((mask | u)==u)' 是什么意思?

python - 对 groupby pandas 数据框的算术运算

C++ cout 多次打印出相同的字符串