Python Pandas:上一行的值 - shift

后端开发 2026-07-10

我从一个用户那里收到了一份需要重新格式化的列表。我需要从前面的行中提取数据。

Make/Model列包含两种不同类型的数据。我需要把Make添加到Model行中。

这段代码只把Make添加到了模型的第一行。 我知道我已经快到了,但不知道下一步该怎么做。

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]})

df['manufacturor'] = np.where(
    df['firstYear'].shift(1).isna() & df['style'].shift(1).isna() == True,
    df['Make/Model'].shift(1),
    df['manufacturor'].shift(1))

解决方案

你可以使用 ffill(向前填充)来实现这一点:

df["manufacturor"] = df["Make/Model"].where(df["firstYear"].isna()).ffill()
# Filter out the original manufacturor rows
df.dropna(subset=["firstYear"], inplace=True)
# Optional: convert year to int, since there won't be any NaNs after dropna
df["firstYear"] = df["firstYear"].astype(int)
# Rename 'Make/Model' to 'Model' for clarity
df.rename(columns={"Make/Model": "Model"}, inplace=True)
print(df)
       Model  firstYear    style number doors manufacturor
1     BRONCO       1965      suv         2, 4         FORD
2   MAVERICK       1970  compact         2,4          FORD
3    MUSTANG       1964    sport            2         FORD
5      CIVIC       1972  compact         2, 4        HONDA
6       CR-V       1995      suv            4        HONDA
8     TUCSON       2004      suv            4      HYUNDAI
9    ELANTRA       1990  compact            4      HYUNDAI
11    CAMERY       1982    sedan            4       TOYOTA
12    AVALON       2000    sedan            4       TOYOTA

顺便说一句,不需要像你的代码中那样提前添加 manufacturor 列。给 df["manufacturor"] 赋值就能把它创建好。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章