You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:43:18