如何在Pandas中按分组合并行、替换NaN值并提取Speed最大值?
问题:DataFrame分组合并、填充NaN并提取Speed最大值
原始DataFrame:
df Node Interface Speed carrier 1-May 9-May 2-Jun 21-Jun Server1 internet1 10 ATT 20 30 50 90 Server1 wan3.0 20 Comcast NaN NaN NaN 100 Server1 wan3.0 50 Comcast 30 40 40 NaN Server2 wan2 100 Sprint 90 70 NaN NaN Server2 wan2 20 Sprint NaN NaN 88 70 Server2 Internet2 40 Verizon 10 60 90 70
需要按Node和Interface分组合并行,用同组内其他行的值替换NaN,同时提取该接口对应的Speed最大值,预期结果如下:
df1 Node Interface Speed carrier 1-May 9-May 2-Jun 21-Jun Server1 internet1 10 ATT 20 30 50 90 Server1 wan3.0 50 Comcast 30 40 40 100 Server2 wan2 100 Sprint 90 70 88 70 Server2 Internet2 40 Verizon 10 60 90 70
用户尝试了以下代码但效果不理想:
df2=df.groupby(['Node','Interface','carrier']),agg({'Speep': 'max'}).reset_index() df3=df.drop('Speed', axis=1) df4=df3.ffill().drop_duplicates()
解决方案
可以通过分组后对各列指定处理逻辑一步实现需求,以下两种方式任选:
方法一:直接聚合处理
# 按Node和Interface分组,为每列定义处理规则 df_result = df.groupby(['Node', 'Interface'], as_index=False).agg( Speed=('Speed', 'max'), carrier=('carrier', 'first'), # 同组内carrier值一致,取第一个即可 **{col: (col, lambda x: x.dropna().iloc[0]) for col in df.columns if col not in ['Node', 'Interface', 'Speed', 'carrier']} )
方法二:先填充再合并最大值
# 1. 分组后用同组非空值填充所有NaN df_filled = df.groupby(['Node', 'Interface']).transform(lambda x: x.fillna(x.dropna().iloc[0] if not x.dropna().empty else x)) # 2. 分组提取每组的Speed最大值 df_max_speed = df.groupby(['Node', 'Interface'], as_index=False)['Speed'].max() # 3. 合并结果并去重 df_result = df_filled.merge(df_max_speed, on=['Node', 'Interface'], suffixes=('', '_max'))\ .drop('Speed', axis=1)\ .rename(columns={'Speed_max': 'Speed'})\ .drop_duplicates()
逻辑说明
- 两种方法核心都是基于
Node+Interface分组:日期列取同组内非空值(同组行的日期值互补),Speed取组内最大值,carrier因同组值一致直接取任意非空值即可。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

