如何在Pandas中复制Range列为A的行并为Activity列添加不同内容?
Pandas实现指定行复制并添加对应Activity列值
初始DataFrame
import pandas as pd table = pd.DataFrame({'Range': ["A", "B", "C", "A"],'First Name': ["W","X","Y", "Z"], 'ID': [1,2,3,4]})

需求说明
当Range列的值为"A"时,复制该行,并在新增的Activity列中分别填入"Monitoring"和"Informant";非"A"的行保持原样,Activity列留空,最终效果如下:
当前尝试的代码
columns_new = pd.DataFrame(columns=["NO ID","Level", "Name", "Activity"]) row_modified = [] for index, row in table.iterrows(): rang = row['Range'] f_name= row['First Name'] n_id = row['ID'] columns_new.loc[index, "NO ID"] = n_id columns_new.loc[index, "Level"] = rang columns_new.loc[index, "Name"] = f_name if rang == "A": row_modified.append(row) row_modified.append(row) else: row_modified.append(row) column_new2 = pd.DataFrame(row_modified) column_new2
运行后仅实现了行复制,但未添加Activity列的指定值,当前结果:
解决方案
以下两种方式均可实现需求:
方法1:基于循环修改(适配现有思路)
在循环中直接处理Activity列的值,复制行时分别赋予对应内容:
row_modified = [] for _, row in table.iterrows(): # 将行转为字典方便修改 row_dict = row.to_dict() if row['Range'] == "A": # 第一行添加Monitoring row_dict['Activity'] = "Monitoring" row_modified.append(row_dict) # 复制一行并修改Activity为Informant row_dict_copy = row_dict.copy() row_dict_copy['Activity'] = "Informant" row_modified.append(row_dict_copy) else: # 非A的行Activity留空 row_dict['Activity'] = "" row_modified.append(row_dict) # 转换为DataFrame并调整列顺序匹配期望输出 result = pd.DataFrame(row_modified)[['Range', 'First Name', 'ID', 'Activity']] print(result)
方法2:Pandas矢量化操作(更高效)
利用explode方法实现行扩展,避免循环:
# 为每行匹配对应的Activity列表:A对应两个值,其他对应空值列表 table['Activity'] = table['Range'].apply(lambda x: ["Monitoring", "Informant"] if x == "A" else [""]) # 按Activity列展开行 result = table.explode('Activity').reset_index(drop=True) print(result)
内容的提问来源于stack exchange,提问作者V0N_fs
相关产品推荐
相关产品推荐

