如何高效填充Pandas DataFrame:基于最近含'String'参考行的对应列值
如何高效填充Pandas DataFrame:基于最近含'String'参考行的对应列值
嘿,这个需求我太熟了!本质上就是带条件的前向填充,完全可以用Pandas原生函数组合搞定,效率比你之前手动生成新DataFrame的方法高太多,根本不用绕弯路~
先给你理清楚核心逻辑:我们只需要先把所有「最后一列是'String'」的参考行的对应列值保留下来,其他行的对应列设为空值(NaN),然后用Pandas的ffill()(前向填充)就能自动把参考值一直填充到下一个参考行出现前的所有行,完美匹配你的要求!
步骤1:构造示例数据(匹配你的需求)
先把你描述的原始数据转成可运行的DataFrame,同时把需要填充的X、Y替换成NaN(如果你的原始数据里是特定标记比如'X',可以先转成NaN,后面会说):
import pandas as pd import numpy as np # 对应你给出的原始数据,把X/Y换成NaN data = [ [1, 2, 3, 'String', ''], [4, '', np.nan, '', ''], [5, '', np.nan, '', ''], [6, 7, 'String', '', ''], [1, '', np.nan, '', ''] ] df = pd.DataFrame(data, columns=['col0', 'col1', 'col2', 'col3', 'col4'])
步骤2:提取参考行的有效数值
针对需要填充的列(比如你例子里X/Y所在的col2),我们用where()函数只保留参考行(col4 == 'String',也就是最后一列是'String'的行)的数值,其他行设为NaN:
# 提取col2列中,仅参考行的有效数值,其他为NaN filled_col = df['col2'].where(df['col4'] == 'String')
步骤3:前向填充并替换原列
直接对上面得到的filled_col用ffill(),然后把结果赋值回原DataFrame的对应列就搞定了:
df['col2'] = filled_col.ffill()
看结果!
运行完上面的代码,你的DataFrame就会变成你想要的样子:
col0 col1 col2 col3 col4 0 1 2 3.0 String 1 4 3.0 2 5 3.0 3 6 7 NaN String 4 1 7.0
完全实现了“第一个3保留到下一个'String'参考行出现,之后替换为7”的需求~
额外处理:如果原始数据是X/Y标记而非NaN
如果你的原始数据里不是NaN,而是用'X'、'Y'标记需要填充的位置,先把这些标记替换成NaN就行:
# 把X/Y替换为NaN,再执行上面的填充步骤 df['col2'] = df['col2'].replace(['X', 'Y'], np.nan)
为什么这个方法高效?
因为全程用的是Pandas的矢量化操作,没有循环或手动切片,处理百万级别的数据都毫无压力,比你之前的方法快几个数量级。本质上就是把你的需求转化成了标准的前向填充场景,完美利用了Pandas的底层优化能力。
内容来源于stack exchange
相关产品推荐
相关产品推荐

