如何在Pandas中按同颜色分组对num2列执行向前填充(ffill)?
解决方案
失效原因
- 链式索引问题:
df[df['color'] == color]['num2']返回的是原DataFrame的副本,对副本赋值、或者加inplace=True修改的都是副本,不会生效到原表。 - 列名大小写不匹配:你示例中颜色列名是
Color(首字母大写),如果代码里写的是小写color,会导致取值错误无法匹配分组。 - 额外注意:如果你的
na是字符串格式,需要先替换为pandas可识别的空值NaN,否则fillna不会处理。
操作步骤
- (可选,仅当na为字符串时执行)将字符串na转成NaN:
import numpy as np df['num2'] = df['num2'].replace('na', np.nan)
- 分组向前填充,一行代码即可完成需求:
df['num2'] = df.groupby('Color')['num2'].fillna(method='ffill')
执行后会严格按颜色分组做向前填充:同组内空值才会取同组上一行的有效值填充,分组首行的空值不会被其他分组的值填充,完全匹配你的预期结果。
循环写法修正(如果你需要保留循环逻辑)
如果非要用循环实现,要改用loc直接定位原表的行和列,避免生成副本:
for color in df['Color'].unique(): color_mask = df['Color'] == color df.loc[color_mask, 'num2'] = df.loc[color_mask, 'num2'].fillna(method='ffill')
内容的提问来源于stack exchange,提问作者swag19
相关产品推荐
相关产品推荐

