Pandas新手如何将for循环输出的姓名与计算结果转为两列DataFrame
实现方案
方案1:基于你现有循环改造(符合你想存为字典/列表再转DataFrame的思路)
你只需要在循环外初始化一个空列表存储每一行的结果,循环内把每次计算的姓名和结果存入列表,最后直接转DataFrame即可:
import pandas as pd names = df['Participant Name, Number'].unique() # 初始化空列表存储结果 result_list = [] for name in names: unique_name_df = df[df['Participant Name, Number'] == name] badge_types = unique_name_df['Dosimeter Location'].unique() collar = 0.0 chest = 0.0 if 'Collar' in badge_types: collar = unique_name_df[unique_name_df['Dosimeter Location'] == 'Collar']['Total DDE'].astype(float).sum() if 'Chest' in badge_types: chest = unique_name_df[unique_name_df['Dosimeter Location'] == 'Chest']['Total DDE'].astype(float).sum() value = None if len(badge_types) == 1: if 'Collar' in badge_types: value = collar elif 'Chest' in badge_types: value = chest # 把当前结果加入列表,这里的key就是最终DataFrame的列名 result_list.append({ 'Participant Name, Number': name, 'Total Calculated DDE': value }) # 转换为DataFrame result_df = pd.DataFrame(result_list) # 打印结果 print(result_df)
注意:你原代码未处理参与者同时有Collar和Chest徽章的情况,上面代码给这类情况的value默认赋值为
None,你可以根据自己的业务需求调整这部分逻辑。
方案2:更高效的Pandas原生写法(无需手动写循环)
用Pandas的分组聚合功能可以更简洁实现同样需求,性能也比手动循环更高:
import pandas as pd # 先把Total DDE转为浮点型,避免重复转换 df['Total DDE'] = df['Total DDE'].astype(float) # 按人员和徽章位置分组求和 grouped = df.groupby(['Participant Name, Number', 'Dosimeter Location'])['Total DDE'].sum().unstack(fill_value=0) # 筛选只有单一徽章类型的人员 grouped['badge_count'] = grouped[['Collar', 'Chest']].astype(bool).sum(axis=1) single_badge = grouped[grouped['badge_count'] == 1].copy() # 计算最终结果 single_badge['Total Calculated DDE'] = single_badge['Collar'].where(single_badge['Collar'] > 0, single_badge['Chest']) # 提取需要的列作为最终结果 result_df = single_badge.reset_index()[['Participant Name, Number', 'Total Calculated DDE']] print(result_df)
内容的提问来源于stack exchange,提问作者Alex Petrone
相关产品推荐
相关产品推荐

