如何在Pandas中基于其他列值填充DataFrame的空单元格
问题分析与解决方案
原代码问题拆解
方法1:嵌套循环的错误
- 循环逻辑错误:嵌套遍历
df1['C']和df1['D']是将C列的每个元素与D列的每个元素配对,而非同一行的对应值,完全偏离需求。 - 条件判断失效:
row == ('cat' or 'dog')等价于row == 'cat',因为or会返回第一个非空字符串,dog的情况永远不会触发;同理('horse' or 'cow' or 'bird')只会匹配horse。 - 赋值操作错误:
df1['C'] == 'house'是比较运算符,不是赋值,应该用单等号=。 - 提前终止循环:每个循环内的
break会让代码只执行一次就退出,根本没处理所有行。
方法2:loc索引的错误
- 逻辑运算符错误:Pandas布尔索引必须用元素级的
&而非Python的and,且每个条件需加括号(避免优先级问题)。 - 空值判断不准确:
df1['C'] == ' '仅匹配空格,无法识别NaN/None类型的空值,应该用pd.isna(df1['C'])统一判断所有空值类型。
正确实现方案
方案1:分情况用loc赋值
适合需要明确区分条件的场景:
import pandas as pd # 先统一处理空值(如果原数据有空字符串,替换为标准NaN) df1['C'] = df1['C'].replace(' ', pd.NA) # 情况1:C列为空,D列是cat/dog → 填充house df1.loc[pd.isna(df1['C']) & df1['D'].isin(['cat', 'dog']), 'C'] = 'house' # 情况2:C列为空,D列是horse/cow/bird → 填充garden df1.loc[pd.isna(df1['C']) & df1['D'].isin(['horse', 'cow', 'bird']), 'C'] = 'garden'
方案2:用映射字典+fillna(更简洁)
适合映射关系明确的场景:
import pandas as pd # 创建D列到C列填充值的映射字典 fill_map = { 'cat': 'house', 'dog': 'house', 'horse': 'garden', 'cow': 'garden', 'bird': 'garden' } # 直接用D列的映射值填充C列空值 df1['C'] = df1['C'].fillna(df1['D'].map(fill_map))
内容的提问来源于stack exchange,提问作者Karolina
相关产品推荐
相关产品推荐

