Pandas数据处理:将指定列非空值移至对应行下方新行
处理Pandas DataFrame别名行展开需求
原始DataFrame
import pandas as pd data = { 'Name Type': ["Primary", "Primary", "Primary"], 'Full Name': ["John Snow", "Daenerys Targaryen", "Brienne Tarth"], 'AKA': ["Aegon Targaryen", None, None], 'LQAKA': ["The Bastard of Winterfell", "Mother of Dragons", None], 'Other': ["Info", "Info", "Info"]} df = pd.DataFrame(data)
需求说明
将AKA和LQAKA列中的非空值移至对应Primary名称所在行的下方,同时将Name Type设为对应列名(AKA或LQAKA);值为None时不生成新行。Other等其他列仅保留Primary行的信息,最终预期结果如下:
| Name Type | Full Name | Other |
|---|---|---|
| Primary | John Snow | Info |
| AKA | Aegon Targaryen | |
| LQAKA | The Bastard of Winterfell | |
| Primary | Daenerys Targaryen | Info |
| LQAKA | Mother of Dragons | |
| Primary | Brienne Tarth | Info |
解决方案代码
# 提取Primary行的核心数据 primary_df = df[['Name Type', 'Full Name', 'Other']] # 处理AKA列生成对应行 aka_df = df[df['AKA'].notna()].rename(columns={'AKA': 'Full Name'}) aka_df['Name Type'] = 'AKA' aka_df = aka_df[['Name Type', 'Full Name', 'Other']] aka_df['Other'] = '' # 处理LQAKA列生成对应行 lqaka_df = df[df['LQAKA'].notna()].rename(columns={'LQAKA': 'Full Name'}) lqaka_df['Name Type'] = 'LQAKA' lqaka_df = lqaka_df[['Name Type', 'Full Name', 'Other']] lqaka_df['Other'] = '' # 按原始顺序合并并排序,保证别名行紧跟对应Primary行 result = pd.concat([primary_df, aka_df, lqaka_df]).sort_index(kind='mergesort') result = result.reset_index(drop=True) print(result)
代码逻辑说明
- 提取Primary基础行:直接取出原始表中
Name Type为Primary的核心列,保留Other列的原始信息。 - 处理AKA列:筛选
AKA非空的行,将AKA列重命名为Full Name,修改Name Type为AKA,清空Other列内容后保留目标列。 - 处理LQAKA列:和AKA列逻辑一致,筛选非空行后调整列名与
Name Type,清空Other列。 - 合并排序:将三个表合并,用
mergesort按原始索引排序,确保别名行紧跟对应Primary行,最后重置索引得到最终结果。
内容的提问来源于stack exchange,提问作者nzskra
相关产品推荐
相关产品推荐

