我有一個包含數字列的資料框,其中一個包含一些“tbd”值。我想用來自其他列的 groupby 的平均值替換那些“tbd”值。我了解您可以使用以下方法填充值
df['col_d'] = df.groupby(['col_a', 'col_b'])['col_c'].transform(lambda x: x.fillna(x.round().mean()))
我不能使用 fillna,因為我已經有了 na 值,我不想洗掉它們并附加它們,因為我將在稍后階段需要它們。我知道我可以使用映射,但我想知道有沒有更優雅的替換方法?
輸入 col_b 包含 NaN 和 'tbd' 我想使用一組 col_a 和 col_c 來填充 'tbd'
col_a col_b col_c
1 1 1
2 2 2
3 'tbd' 3
3 'tbd' 3
5 5 5
6 NaN 6
輸出使用 col_a 和 col_c 的平均值
col_a col_b col_c
1 1 1
2 2 2
6 7 8
5 6 7
5 5 5
6 NaN 6
簡單的例子,但我相信它解釋了這個問題,它本質上取代了我用替換方法列出的示例 lambda 函式的 fillna 方法
uj5u.com熱心網友回復:
您可以使用np.where, 并用于to_numeric將 'tbd' 更改為 nan 以便能夠執行平均操作。
# dummy data
df = pd.DataFrame({
'col_a':['a']*8, 'col_b':['b','c']*4,
'col_c':[1,1,np.nan,np.nan,'tbd',3,4,'tbd']
})
df['col_d'] = np.where(
df['col_c'].eq('tbd'),
pd.to_numeric(df['col_c'], errors='coerce')
.groupby([df['col_a'],df['col_b']]).transform('mean'),
df['col_c']
)
print(df)
# col_a col_b col_c col_d
# 0 a b 1 1
# 1 a c 1 1
# 2 a b NaN NaN
# 3 a c NaN NaN
# 4 a b tbd 2.5
# 5 a c 3 3
# 6 a b 4 4
# 7 a c tbd 2.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357496.html
上一篇:子序列初始資料的快速生成方法
