如何在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
相关产品推荐
相关产品推荐

