[英]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 = 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.