如何按Name分组对DataFrame的Signal列nan值用对应分组众数填充
按分组众数填充Signal列空值的实现方案
我们可以通过pandas的分组转换逻辑实现需求,核心思路是按Name列拆分分组后,提取每组Signal列的众数,再填充对应组的空值:
完整代码示例
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'Timestamp': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-01', '2021-01-02', '2021-01-03'], 'Name': ['A', 'A', 'A', 'B', 'B', 'B'], 'Signal': ['On', np.nan, 'On', 'Off', 'Off', np.nan] }) # 核心填充逻辑 df['Signal'] = df.groupby('Name')['Signal'].transform( lambda x: x.fillna(x.mode()[0]) )
逻辑说明
groupby('Name'):按Name列将数据集拆分为独立分组transform:对每个分组内的Signal列做转换处理,返回的序列长度和原数据一致,自动对齐索引不会打乱原有数据顺序x.mode()[0]:提取当前分组Signal列的众数,加[0]是为了兼容某组存在多个众数的场景,默认取第一个出现的众数,可根据业务需求调整选择规则- 若需要兼容分组内Signal全为空的极端场景,避免取众数时报错,可以把lambda逻辑调整为:
lambda x: x.fillna(x.mode()[0]) if not x.mode().empty else x
运行代码后即可得到预期结果:A组的空值填充为On,B组的空值填充为Off。
内容的提问来源于stack exchange,提问作者Elgun Valiyev
相关产品推荐
相关产品推荐

