Pandas:基于多行状态为多索引DataFrame添加列求和行
Solution for Summing Values Based on Power Status in Multi-Index DataFrame
我来帮你搞定这个基于power状态汇总多索引DataFrame的需求,咱们一步一步来实现:
步骤1:识别每个type是否存在power='on'的记录
首先从多索引中提取measure='power'的行,判断每个type下有没有任意name的t1状态为'on':
import pandas as pd import numpy as np # 你的原始数据和DataFrame初始化 data = [{'measure':'value1','name':'A','type':'x','t1':3,'t2':5}, {'measure':'value1','name':'B','type':'y','t1':30,'t2':33}, {'measure':'value1','name':'C','type':'y','t1':30,'t2':33}, {'measure':'value2','name':'A','type':'x','t1':25,'t2':11}, {'measure':'value2','name':'B','type':'y','t1':4,'t2':4}, {'measure':'power','name':'A','type':'x','t1':'off','t2':'off'}, {'measure':'power','name':'B','type':'y','t1':'on','t2':'off'}, {'measure':'power','name':'C','type':'y','t1':'off','t2':'nan'}] df = pd.DataFrame(data) df = df.set_index(['measure','name','type']) # 提取power行,标记每个type是否有on状态 power_rows = df.xs('power', level='measure').reset_index() type_has_active_power = power_rows.groupby('type')['t1'].apply(lambda x: any(val == 'on' for val in x))
步骤2:筛选并汇总符合条件的数值行
接下来筛选出measure为value1或value2的行,且对应的type存在power='on'的记录,然后按type对数值列求和:
# 筛选需要汇总的目标行:value1/value2 + 有active power的type target_rows = df[ df.index.get_level_values('measure').isin(['value1', 'value2']) & df.index.get_level_values('type').isin(type_has_active_power[type_has_active_power].index) ] # 按type求和,自动忽略非数值列(value行的t1/t2都是数值) sum_results = target_rows.groupby('type')[['t1', 't2']].sum()
步骤3:构建符合原多索引结构的汇总行
把求和结果转换成和原DataFrame一致的多索引格式,同时为没有power='on'的type添加nan填充行:
# 转换为多索引:measure='SUM', name='nan', type对应原类型 sum_index = pd.MultiIndex.from_tuples( [('SUM', 'nan', t) for t in sum_results.index], names=['measure', 'name', 'type'] ) sum_results.index = sum_index # 为没有active power的type添加nan行(比如示例中的type x) all_types = df.index.get_level_values('type').unique() missing_types = [t for t in all_types if t not in sum_results.index.get_level_values('type')] for t in missing_types: sum_results.loc[('SUM', 'nan', t), :] = [np.nan, np.nan] # 保持type的顺序和原DataFrame一致 sum_results = sum_results.reindex(all_types, level='type')
步骤4:合并并导出结果
最后把汇总行追加到原DataFrame底部,导出为CSV:
# 合并原数据和汇总行 final_df = pd.concat([df, sum_results]) # 查看最终结果 print(final_df) # 导出为CSV文件 final_df.to_csv('summary_result.csv')
运行后得到的结果和你期望的一致(注:示例中t2的求和结果应为33+33+4=70,你写的nan应该是笔误,代码会正确计算数值列的和):
t1 t2 measure name type value1 A x 3 5 B y 30 33 C y 30 33 value2 A x 25 11 B y 4 4 power A x off off B y on off C y off nan SUM nan x NaN NaN nan y 34 70
内容的提问来源于stack exchange,提问作者skleijn
相关产品推荐
相关产品推荐

