如何高效合并Pandas的DataFrame与Series以填补空值?
高效合并DataFrame与Series填充空值的方法
原始数据
import pandas as pd _df = pd.DataFrame({'a': [1, '', '', 4], 'b': ['apple', 'banana', 'orange', 'pear']}, columns=['a', 'b']) _series = pd.Series(['', 2, 3, ''], name="a")
需求
沿a列合并两者,消除所有空值,得到如下结果:
a b 0 1 apple 1 2 banana 2 3 orange 3 4 pear
低效的循环实现
原方法通过Python循环遍历赋值,大数据量下速度极慢:
for i in range(len(_df.iloc[:, 0].to_list())): if _df.iloc[i, 0] == '': _df.iloc[i, 0] = _series[i]
高效实现方案
以下均为Pandas向量化操作,底层由C实现,性能远优于Python循环:
方法1:使用mask直接替换空值
直接判断_df['a']的空字符串位置,用_series对应值替换,最后转整数类型:
_df['a'] = _df['a'].mask(_df['a'] == '', _series).astype(int)
方法2:使用where反向判断
逻辑与mask相反,保留非空值,空值位置替换为_series的值:
_df['a'] = _df['a'].where(_df['a'] != '', _series).astype(int)
方法3:使用combine_first合并填充
先将空字符串转为Pandas缺失值pd.NA,再用combine_first合并(该方法会自动用右侧值填充左侧缺失值):
_df['a'] = _df['a'].replace('', pd.NA).combine_first(_series.replace('', pd.NA)).astype(int)
方法4:使用fillna填充缺失值
同样先转换空字符串为缺失值,再用_series填充:
_df['a'] = _df['a'].replace('', pd.NA).fillna(_series).astype(int)
内容的提问来源于stack exchange,提问作者haojie
相关产品推荐
相关产品推荐

