求助:Pandas中使用shift批量填充manufacturor字段的问题
解决DataFrame中品牌信息向下填充至对应车型的问题
你的问题出在仅通过相邻行赋值,没有实现连续前向填充,所以只能给第一个车型行填充品牌。以下是完整解决方案:
核心思路
- 先识别品牌行:当
firstYear和style同时为NaN时,该行是品牌行,提取Make/Model作为品牌值。 - 用前向填充(
ffill)将品牌值传递给后续所有属于该品牌的车型行,直到遇到下一个品牌行。
完整代码
import numpy as np import pandas as pd df = pd.DataFrame({ 'Make/Model': ['FORD', 'BRONCO', 'MAVERICK', 'MUSTANG', 'HONDA', 'CIVIC', 'CR-V', 'HYUNDAI', 'TUCSON', 'ELANTRA', 'TOYOTA', 'CAMERY', 'AVALON'], 'firstYear': [np.nan, 1965.0, 1970.0, 1964.0, np.nan, 1972.0, 1995.0, np.nan, 2004.0, 1990.0, np.nan, 1982.0, 2000.0], 'style': [np.nan, 'suv', 'compact', 'sport', np.nan, 'compact', 'suv', np.nan, 'suv', 'compact', np.nan, 'sedan', 'sedan'], 'number doors': [np.nan, '2, 4', '2,4 ', '2', np.nan, '2, 4', '4', np.nan, '4', '4', np.nan, '4', '4'], 'manufacturor': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan] }) # 1. 标记品牌行,提取品牌值 df['manufacturor'] = np.where( df['firstYear'].isna() & df['style'].isna(), df['Make/Model'], np.nan ) # 2. 前向填充品牌值到后续所有车型行 df['manufacturor'] = df['manufacturor'].ffill() # 可选:如果不需要品牌行自身显示manufacturor值,执行以下代码 # df.loc[df['firstYear'].isna() & df['style'].isna(), 'manufacturor'] = np.nan print(df)
代码说明
- 第一步通过
np.where筛选出所有品牌行,将对应Make/Model赋值给manufacturor,非品牌行暂设为NaN。 - 第二步的
ffill()方法会自动将每个品牌值向下填充,覆盖后续所有属于该品牌的车型行,直到遇到下一个品牌值。 - 可选步骤用于清除品牌行自身的
manufacturor值,根据需求选择是否执行。
运行结果示例
处理后的数据框中,所有车型行的manufacturor都会正确对应所属品牌:
| Make/Model | firstYear | style | number doors | manufacturor |
|---|---|---|---|---|
| FORD | NaN | NaN | NaN | FORD |
| BRONCO | 1965.0 | suv | 2, 4 | FORD |
| MAVERICK | 1970.0 | compact | 2,4 | FORD |
| MUSTANG | 1964.0 | sport | 2 | FORD |
| HONDA | NaN | NaN | NaN | HONDA |
| CIVIC | 1972.0 | compact | 2, 4 | HONDA |
| ... | ... | ... | ... | ... |
内容的提问来源于stack exchange,提问作者KBD
相关产品推荐
相关产品推荐

