用 Groupby 替换值
Replace Values With Groupby
我有一个包含数字列的数据框,其中一列包含一些 '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
简单的例子,但我相信它解释了这个问题,它实质上是用 replace 方法代替了我列出的示例 lambda 函数的 fillna 方法
可以用np.where
,用to_numeric
改成nan 'tbd'就可以进行均值运算了
# 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
我有一个包含数字列的数据框,其中一列包含一些 '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
简单的例子,但我相信它解释了这个问题,它实质上是用 replace 方法代替了我列出的示例 lambda 函数的 fillna 方法
可以用np.where
,用to_numeric
改成nan 'tbd'就可以进行均值运算了
# 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