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