我有一個 DataFrame,我希望根據它們的分組在列中填充值。如果要填充的列中只有一個唯一值,我只想填充值(通過使用ffilland傳播非 NaN 值);bfill否則,它應該保持原樣。我下面的代碼有一個示例資料集,我嘗試在其中執行此操作,但出現錯誤。
代碼:
df = pd.DataFrame({"A": [1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6, 6],
"B": ['a', 'a', np.nan, 'b', 'b', 'c', np.nan, 'd', np.nan, 'e', 'e', np.nan, 'h', 'h'],
"C": [5.0, np.nan, 4.0, 4.0, np.nan, 9.0, np.nan, np.nan, 9.0, 8.0, np.nan, 2.0, np.nan, np.nan]})
col_to_groupby = "A"
col_to_modify = "B"
group = df.groupby(col_to_groupby)
modified = group[group[col_to_modify].nunique() == 1].transform(lambda x: x.ffill().bfill())
df.update(modified)
錯誤:
KeyError:'未找到列:假,真'
原始資料集:
A B C
0 1 a 5.0
1 1 a NaN
2 2 NaN 4.0
3 2 b 4.0
4 2 b NaN
5 3 c 9.0
6 3 NaN NaN
7 3 d NaN
8 3 NaN 9.0
9 4 e 8.0
10 4 e NaN
11 5 NaN 2.0
12 6 h NaN
13 6 NaN NaN
期望的結果:
A B C
0 1 a 5.0
1 1 a NaN
2 2 b 4.0
3 2 b 4.0
4 2 b NaN
5 3 c 9.0
6 3 NaN NaN
7 3 d NaN
8 3 NaN 9.0
9 4 e 8.0
10 4 e NaN
11 5 NaN 2.0
12 6 h NaN
13 6 h NaN
以上是期望的結果,因為
- 行索引 2 在第 2 組中,在 B 列(“b”)中只有 1 個唯一值,所以它被改變了。
- 行索引 6 和 8 在第 3 組中,但 B 列中有 2 個唯一值(“c”和“d”),因此它們保持不變。
- 行索引 5 位于組 11 中,但 B 列中沒有要傳播的資料。
- 行索引 13 在第 6 組中,在 B 列(“h”)中只有 1 個唯一值,因此它被更改。
uj5u.com熱心網友回復:
一種選擇是在 中添加條件groupby.apply:
df[col_to_modify] = df.groupby(col_to_groupby)[col_to_modify].apply(lambda x: x.ffill().bfill() if x.nunique()==1 else x)
另一種可能是使用groupby transform(nunique)為eq具有唯一值的組創建布爾過濾器;groupby然后使用 first( firstdrop NaN)更新這些行where:
g = df.groupby(col_to_groupby)[col_to_modify]
df[col_to_modify] = g.transform('first').where(g.transform('nunique').eq(1), df[col_to_modify])
輸出:
A B C
0 1 a 5.0
1 1 a NaN
2 2 b 4.0
3 2 b 4.0
4 2 b NaN
5 3 c 9.0
6 3 NaN NaN
7 3 d NaN
8 3 NaN 9.0
9 4 e 8.0
10 4 e NaN
11 5 NaN 2.0
12 6 h NaN
13 6 h NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/444538.html
標籤:Python 熊猫 数据框 熊猫-groupby
