Pandas中识别空字符串及列值条件填充的问题排查
Pandas中空字符串的识别与条件填充问题解决
一、如何在Pandas Series中识别空字符串?
在Pandas里,空字符串('')和缺失值(NaN)是完全不同的概念,识别方式也有区别:
- 要精准识别空字符串,直接用逐元素比较:
series == '',这会返回一个布尔Series,True对应的就是空字符串所在的位置。
举个实际例子:import pandas as pd s = pd.Series(['', 'male', '', 'female', None]) empty_str_mask = s == '' # 结果:0 True, 1 False, 2 True, 3 False, 4 False - 注意:
pd.isna(s)只能识别None或NaN,不会把空字符串判定为缺失值(pd.isna('')返回False)。如果你的数据里既有空字符串又有NaN,可以先把空字符串转成NaN再统一处理:s = s.replace('', pd.NA),之后就能用pd.isna()识别所有缺失情况了。
二、解决你的DataFrame条件填充问题
先拆解你代码里的核心问题:你用len(df4['gender']) == 0或者df4['gender'].empty,这两个判断的是整个gender列是否完全没有元素,而不是判断每一行的gender值是不是空字符串!你的gender列有7个元素,所以这两个条件永远为False,代码自然一直走else分支,只取gender列的值。
正确的思路是逐行判断每个gender元素是否为空字符串,这里推荐用向量化的np.where(比apply高效得多),代码如下:
import numpy as np import pandas as pd vals = { 'name' : ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7'], 'gender' : ['', '', '', 'f', 'f', 'c', 'c'], 'age' : [39, 12, 27, 13, 36, 29, 10] } df4 = pd.DataFrame(vals) # 核心逻辑:逐行判断gender是否为空字符串,是则取name,否则取gender df4['column3'] = np.where(df4['gender'] == '', df4['name'], df4['gender'])
运行后你会得到符合预期的column3:['n1', 'n2', 'n3', 'f', 'f', 'c', 'c']。
如果你习惯用apply(适合复杂逻辑,但数据量大时效率较低),也可以这么写:
df4['column3'] = df4.apply(lambda row: row['name'] if row['gender'] == '' else row['gender'], axis=1)
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

