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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:40:54