Python Pandas:上一行的值 - shift
我从一个用户那里收到了一份需要重新格式化的列表。我需要从前面的行中提取数据。
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。