繁体   English   中英

根据条件为 DF 列分配新值

[英]Assign new values to DF column based on a condition

我需要为列 ('A') 中分配为 0(零)的所有寄存器分配一个值。 此新值将是在另一列 ('B') 上注册的共享相同值的每个寄存器的平均值,即:所有将 'A' 分配为 0 的行都将其值替换为 'A' 的平均值在对“B”具有相同值的人中发现。 显然,以下代码不起作用,因为当我在它之后调用print(df.A)时,我返回了一些带有 'A' 为 0 的行:

df = df[df.A == 0].groupby('B')['A'].mean().reset_index()

我尝试了一堆行代码,但有些甚至不被接受......

我期望的是一种情况,即 A 的所有 0 值都被替换为按 B 列分组的 A 列的平均值。 像这样:

前:

Output:
     A    B
1    0    7    
2    0    7
3    9    7
4   10    6
5    8    6
6    0    6
7    0    2

后:

Output:

         A    B
    1    3    7    
    2    3    7
    3    9    7
    4   10    6
    5    8    6
    6    3    6
    7    0    2
 

感谢您的支持。

我想我现在明白你的问题了,但后来我不明白你是如何得到第 6 列 A 的“3”的。我正在遵循我如何能够匹配第 1 行和第 2 列 A 中的 3 的逻辑,我将尝试在下面的代码中解释。 如果这不是完全正确的解释,希望仍然可以让您指向正确的方向。

你的初始 df

df = pd.DataFrame({
    'A': [0, 0, 9, 10, 8, 0, 0], 
    'B': [7, 7, 7, 6, 6, 6, 2]
    })

    A   B
1   0   7
2   0   7
3   9   7
4   10  6
5   8   6
6   0   6
7   0   2

重申目标:

对于 col B 中 col A 为 0 的每个唯一值,找到 col A 中 B 具有该值的行,并取这些 col A 值的平均值。 然后将该平均值覆盖到 A 中那些为 0 的行并与 B 中选择的值对齐。因此,例如,前 3 行在 B 列中有 7,在 A 列中有 0、0、9。前 3 个 A 行的平均值为 3,因此该值将被覆盖在第 1 行和第 2 行 A 列中的 0 上。

脚步

从 col B 获取唯一值,其中 col A 也是 0

bvals_when_a_zero = df[df['A'] == 0]['B'].unique()
array([7, 6, 2])

对于这些唯一值中的每一个,计算列 A 中相应值的平均值

means = [df[df['B'] == i]['A'].mean() for i in bvals_when_a_zero]
[3.0, 6.0, 0.0]

循环 bvals,means 对并用 bval 的相应均值覆盖 0。 大熊猫的逻辑where方法保留满足括号中第一个参数中条件的左侧声明的值(在本例中为 df['A'] 值),否则选择第二个参数作为要保留的值。 我们的条件(df['A'] == 0) & (df['B'] == bval)表示获取 col A 为 0 且 col B 是唯一 bval 之一的行。 但在这里我们实际上想要保留不等于条件的 df['A'] 值,因此括号中的条件参数被前面的~符号否定。

for bval, mean in zip(bvals_when_a_zero, means):
    df['A'] = df['A'].where( ~((df['A'] == 0) & (df['B'] == bval)), mean )

这给出了最终的 df

    A   B
1   3   7
2   3   7
3   9   7
4   10  6
5   8   6
6   6   6
7   0   2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM