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

如何在Pandas DataFrame中按指定条件移动score列的值?

解决Pandas DataFrame中同组score值移动到首次出现行的问题

没问题,我来帮你搞定这个需求!你想要把每个Name分组里的非空score值,转移到该组中sl no等于1的行(也就是每个Name的首次出现行),同时清空原行的score值对吧?下面是具体的实现方法:

方法步骤

1. 先构造示例DataFrame(方便测试)

如果你还没构造好数据,可以用这段代码生成和你示例一致的DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Name': ['Ram', 'Ram', 'Ravi', 'Ravi', 'Kumar', 'Kumar', 'Kumar'],
    'sl no': [1, 2, 1, 2, 1, 2, 3],
    'details': [
        'ram is going to ooty', 
        'ram sings well', 
        'ravi play cricket', 
        'ravi is in chennai', 
        'kumar passed the exam', 
        'kumar is in town', 
        'he left'
    ],
    'score': [np.nan, 1.5, 1.0, np.nan, np.nan, np.nan, 3.0]
})

2. 核心处理逻辑

我们可以先提取每个Name对应的非空score值,再给每个组的sl no=1行赋值,其他行设为NaN:

# 第一步:获取每个Name对应的非空score值(取每组第一个非空值,兼容多非空的情况)
name_score_map = df.dropna(subset=['score']).groupby('Name')['score'].first().to_dict()

# 第二步:遍历每行,只有sl no=1的行保留对应Name的score值,其余设为NaN
df['score'] = df.apply(
    lambda row: name_score_map.get(row['Name'], np.nan) if row['sl no'] == 1 else np.nan,
    axis=1
)

3. 查看结果

运行上面的代码后,你会得到和期望完全一致的输出:

Name  sl no                  details  score
0    Ram      1      ram is going to ooty    1.5
1    Ram      2           ram sings well    NaN
2   Ravi      1        ravi play cricket    1.0
3   Ravi      2       ravi is in chennai    NaN
4  Kumar      1  kumar passed the exam     3.0
5  Kumar      2        kumar is in town     NaN
6  Kumar      3                  he left    NaN

逻辑解释

  • 第一步的groupby('Name')['score'].first()确保我们取每个Name组里第一个非空的score值,哪怕组里有多个非空值也不会出错;
  • 第二步的apply逻辑很直观:只给每个组的首行(sl no=1)赋值,其他行统一设为NaN,完美匹配你的需求。

内容的提问来源于stack exchange,提问作者Pyd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:10:25