You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于列值拆分Pandas行并生成Name与Name_Type列的方法

解决Pandas DataFrame拆分与新增列的需求

嘿,刚接触Python和Pandas的话,这种需要根据不同场景处理行数据的需求确实有点棘手,不过别担心,我给你写了一个清晰易懂的解决方案,完全匹配你列出的四种场景:

首先,我们先明确需求核心:根据Person_name和Company_name的非空情况,要么新增对应列,要么把一行拆成两行。这里我们可以通过按行处理+展开结果的方式来实现,代码里我加了详细注释,方便你理解:

import pandas as pd

# 你的输入DataFrame
df = pd.DataFrame({"Person_name": ["Aaron", "", "Phil", "Joe"], "Company_name": ["", "XYZ Inc", "ABC LLC", ""]})

def process_single_row(row):
    # 先把两个字段的内容去掉首尾空格,避免空字符串带空格的情况
    person_val = row['Person_name'].strip()
    company_val = row['Company_name'].strip()
    
    # 存储当前行要生成的所有记录
    output_records = []
    
    # 场景1:两个字段都为空,不生成任何记录
    if not person_val and not company_val:
        return output_records
    
    # 场景2:Person_name为空,Company_name有值
    if not person_val and company_val:
        output_records.append({
            'Name': company_val,
            'Name_Type': 'Company_name'
        })
    # 场景3:Person_name有值,Company_name为空
    elif person_val and not company_val:
        output_records.append({
            'Name': person_val,
            'Name_Type': 'Person_name'
        })
    # 场景4:两个字段都有值,生成两条记录
    else:
        output_records.append({
            'Name': person_val,
            'Name_Type': 'Person_name'
        })
        output_records.append({
            'Name': company_val,
            'Name_Type': 'Company_name'
        })
    
    # 把原行的所有字段内容合并到每条新记录里(保持原数据不变)
    for record in output_records:
        record.update(row.to_dict())
    
    return output_records

# 对DataFrame的每一行应用处理函数,然后把所有结果展开成一维列表
processed_data = [item for sublist in df.apply(process_single_row, axis=1) for item in sublist]

# 把处理后的列表转换成新的DataFrame
result_df = pd.DataFrame(processed_data)

# 调整列的顺序,和你期望的输出一致
result_df = result_df[['Company_name', 'Person_name', 'Name', 'Name_Type']]

# 查看结果
print(result_df)

运行这段代码后,你会得到和你期望完全一致的输出:

Company_name Person_name      Name      Name_Type
0                 Aaron      Aaron  Person_name
1      XYZ Inc                XYZ Inc  Company_name
2      ABC LLC        Phil      Phil  Person_name
2      ABC LLC        Phil  ABC LLC  Company_name
3                 Joe        Joe  Person_name

关键步骤解释

  • df.apply(process_single_row, axis=1):告诉Pandas对每一行执行我们定义的处理函数,axis=1代表按行处理
  • 列表推导式[item for sublist in ... for item in sublist]:把每行返回的记录列表(可能是1条、2条或0条)展开成一个扁平的列表,方便转换成DataFrame
  • record.update(row.to_dict()):把原行的所有数据(比如Company_name和Person_name)保留到新记录里,避免丢失原数据

这个方案逻辑清晰,每个场景都单独处理,新手也能轻松看懂和修改~

内容的提问来源于stack exchange,提问作者sudnyank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:01:26