基于列值拆分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
相关产品推荐
相关产品推荐

