如何按ColA分组填充DataFrame的NULL值为组内已有对应值
Pandas 分组填充空值实现方案
针对你需要按ColA分组、仅填充组内空值、保留原有非空行的需求,以下是两种可直接运行的实现:
方案1:通用适配版(适合所有场景)
该方案会取每组每列的第一个非空值作为填充值,仅替换空值,原有非空数据完全保留,也兼容非空值出现在组内任意位置的情况:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'ColA': ['cat','cat','fish','fish','fish','dog','dog','dog','frog','frog','frog','frog'], 'ColB': [20,28,32,np.nan,np.nan,3,311,755,np.nan,np.nan,400,np.nan], 'ColC': ['blue','yellow','red',np.nan,np.nan,'black','tan','white',np.nan,np.nan,'green',np.nan] }) # 核心处理逻辑 df[['ColB', 'ColC']] = df.groupby('ColA')[['ColB', 'ColC']].transform( lambda group: group.fillna(group.dropna().iloc[0]) if group.notna().any() else group ) # 输出结果 print(df)
方案2:高效性能版(适合大数据量场景)
如果你的数据量较大,用前后填充的组合写法性能更高,适配你示例中的所有场景:
df[['ColB', 'ColC']] = df.groupby('ColA')[['ColB', 'ColC']].ffill().bfill()
结果验证
两种方案运行后的输出都和你给出的预期完全一致:
ColA ColB ColC 0 cat 20.0 blue 1 cat 28.0 yellow 2 fish 32.0 red 3 fish 32.0 red 4 fish 32.0 red 5 dog 3.0 black 6 dog 311.0 tan 7 dog 755.0 white 8 frog 400.0 green 9 frog 400.0 green 10 frog 400.0 green 11 frog 400.0 green
内容的提问来源于stack exchange,提问作者dmd7
相关产品推荐
相关产品推荐

