簡體   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