基于条件替换DataFrame中character列空值的问题求助
解决方法:根据Role值替换Character列的空值
首先纠正你代码里的核心错误:你定义了DataFrame df,但后续操作的是原始字典all_data——字典并没有loc、isnull()这些DataFrame专属方法,这是你前两种方法失效的关键原因。
针对你的需求,以下是几种高效的实现方式:
方法1:使用np.where(推荐,向量化操作效率最高)
import pandas as pd import numpy as np all_data = { "person_id": [7782, 28692], "id": ["tm82169", "tm17823"], "name": ["John G.Avildsen", "Randal Kleiser"], "character": [np.nan, np.nan], "role": ["DIRECTOR", "ACTOR"] } index_labels = [1,2] df = pd.DataFrame(all_data,index=index_labels) # 仅对空值行,根据role赋值,非空值保持原样 df['character'] = np.where( df['character'].isnull(), np.where(df['role'] == 'ACTOR', 'figurant', 'director'), df['character'] ) print(df)
方法2:使用loc分条件处理
# 先处理DIRECTOR对应的空值 df.loc[(df['character'].isnull()) & (df['role'] == 'DIRECTOR'), 'character'] = 'director' # 再处理ACTOR对应的空值 df.loc[(df['character'].isnull()) & (df['role'] == 'ACTOR'), 'character'] = 'figurant'
方法3:映射字典+填充空值
# 建立role到目标值的映射关系 role_map = {'DIRECTOR': 'director', 'ACTOR': 'figurant'} # 仅对character为空的行,用role映射后的值填充 df['character'] = df['character'].fillna(df['role'].map(role_map))
你的循环方法失效的原因
fillna()默认不修改原DataFrame,必须加上inplace=True才会生效;- 循环逻辑错误:你遍历的是
role的单个值,每次操作却覆盖整个character列,导致最终只有最后一次循环的规则生效。即使修正,循环在pandas中属于低效操作,大数据集下不建议使用。
内容的提问来源于stack exchange,提问作者Anh Tu Pham
相关产品推荐
相关产品推荐

