Pandas如何将DataFrame每行最后一个非NaN值移动至最后一列Year
错位DataFrame年份列规整方案
首先可构造测试数据复现描述的错位场景:
import pandas as pd import numpy as np # 复现问题的测试样例 df = pd.DataFrame({ 'Name': ['Adam', 'Betty', 'Calvin', 'Debra'], 'Gender': ['Male', 1968, 'Male', 'Female'], 'Country': ['USA', np.nan, 1995, 2000], 'Year': [1992, np.nan, np.nan, np.nan] })
核心处理代码,完全匹配给定的三条规则:
# 逐行提取非空值序列 valid_series = df.apply(lambda x: x.dropna().tolist(), axis=1) # 按规则:每行最后一个非空值为年份,直接赋值给Year列 df['Year'] = valid_series.apply(lambda x: x[-1]) # 非空序列去掉首项(Name)、尾项(Year)后,剩余值按顺序填充Gender、Country,无值则填NaN df['Gender'] = valid_series.apply(lambda x: x[1] if len(x) >= 3 else np.nan) df['Country'] = valid_series.apply(lambda x: x[2] if len(x) >= 4 else np.nan)
处理后执行print(df)可得到规整结果:
Name Gender Country Year 0 Adam Male USA 1992 1 Betty NaN NaN 1968 2 Calvin Male NaN 1995 3 Debra Female NaN 2000
逻辑说明:
- 依托规则「每行必然存在Name、Year有效值,且Name为第一个非空值、Year为最后一个非空值」,直接从非空序列首尾取固定字段,不会出现错取
- 中间字段按原列顺序依次填充,错位到Gender/Country列的年份会被自动排除,原位置置空,无残留错位值
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

