Pandas如何将DataFrame的姓名行数据关联到下方对应行生成Name列
Pandas DataFrame行关联提取及报错解决方案
运行报错原因
你使用的代码存在3个核心问题:
- 变量未初始化:循环从
i=1开始遍历,而第一个姓名行(Alfred)在索引i=0的位置,代码没有提前处理这一行给running_name赋初始值,第一次遇到非姓名行时running_name还没被定义,直接触发NameError。 - NaN判断逻辑错误:
is np.nan无法正确判断空值,因为NaN的特性是不等于任何值包括自身,空值判断需要用pd.isna()或者np.isnan()方法。 - 缺少DataFrame初始化:代码没有提前定义
new_df的结构,后续给new_df.loc[j]赋值时也会抛出未定义的错误。
需求实现代码
推荐用pandas内置的向量化方法实现,比循环逻辑更高效简洁:
import pandas as pd import numpy as np # 构造原始数据 df = pd.DataFrame({"1": ['Alfred', 'car', 'bike','Alex','car'], "2": [np.nan, 'Ford', 'Giant',np.nan,'Toyota'], "3": [pd.NaT, pd.Timestamp("2018-01-01"), pd.Timestamp("2018-07-01"),np.nan,pd.Timestamp("2021-01-01")]}) # 新增姓名列:提取姓名行的值向前填充到所有关联行 df['Name'] = df['1'].where(df['2'].isna()).ffill() # 过滤掉原始姓名行,重命名列得到最终结果 result = df[~df['2'].isna()].rename(columns={ '1': 'transportation', '2': 'Mark', '3': 'BuyDate' }).reset_index(drop=True)[['transportation', 'Mark', 'BuyDate', 'Name']] print(result)
运行输出和你期望的结果完全一致:
transportation Mark BuyDate Name 0 car Ford 2018-01-01 Alfred 1 bike Giant 2018-07-01 Alfred 2 car Toyota 2021-01-01 Alex
内容的提问来源于stack exchange,提问作者Yen
相关产品推荐
相关产品推荐

