如何基于条件对DataFrame列指定行求和并输出到新列?
DataFrame条件求和生成新列需求及解决方案
原始数据
ATEXT BEGUZ_UE UE_more_days 0 11.00 0.0 1 CT 23.00 Nan 2 RT 33.00 46.0 3 15.00 0.0 3 15.00 0.0 4 12.75 0.0 5 19.75 0.0 6 14.75 0.0 7 CT 23.00 29.5 8 CT 24.00 46.0 9 CT 24.00 48.0 10 RT 33.00 48.0 11 15.00 0.0 12 etc
期望输出
输出形式1
ATEXT BEGUZ_UE UE_more_days 0 1 CT 23.00 2 RT 33.00 56.0 3 15.00 4 12.75 5 19.75 6 14.75 7 CT 23.00 8 CT 24.00 9 CT 24.00 10 RT 33.00 104.0 11 15.00 12 etc
输出形式2
ATEXT BEGUZ_UE subtract add UE_more_days is_m_days 0 11.00 *0.00* *3.92* 1 CT *23.00* 0.00 0.00 2 RT *33.00* 0.00 0.00 56.0 3 *15.00* 0.20 0.00 *74.92* 4 12.75 5 19.75 6 14.75 *2.00* *0.00* 7 CT *23.00* 8 CT *24.00* 9 CT *24.00* 10 TT *33.00* 104.0 11 *15.00* 0.00 3.57 *117.00* 12 etc
尝试的错误代码
bedd2 = [(df['ATEXT'] != ''),] result2 = [(df.iloc[0:]['BEGUZ_UE'].astype(float).reset_index(drop=True) + df.iloc[1:]['BEGUZ_UE'].astype(float)).round(decimals=2).shift(1)] df['min_UE_mehr_Tage'] = np.select(bedd2, result2)
需求解析与正确实现
从输出结果反推核心规则:仅当ATEXT为RT时,UE_more_days等于该行之前所有ATEXT为CT的BEGUZ_UE之和,加上当前行的BEGUZ_UE;其他行该列留空。
实现代码(匹配输出1)
import pandas as pd import numpy as np # 模拟原始数据(可替换为你的真实数据) data = { 'ATEXT': ['', 'CT', 'RT', '', '', '', '', 'CT', 'CT', 'CT', 'RT', ''], 'BEGUZ_UE': [11.00, 23.00, 33.00, 15.00, 12.75, 19.75, 14.75, 23.00, 24.00, 24.00, 33.00, 15.00], 'UE_more_days': [0.0, np.nan, 46.0, 0.0, 0.0, 0.0, 0.0, 29.5, 46.0, 48.0, 48.0, 0.0] } df = pd.DataFrame(data) # 统一处理ATEXT空值 df['ATEXT'] = df['ATEXT'].fillna('') # 计算CT行的BEGUZ_UE累计和 df['ct_cum_sum'] = np.where(df['ATEXT'] == 'CT', df['BEGUZ_UE'], 0).cumsum() # 为RT行计算UE_more_days,其他行设为NaN df['UE_more_days'] = np.where( df['ATEXT'] == 'RT', df['ct_cum_sum'].shift(1) + df['BEGUZ_UE'], np.nan ) # 删除临时辅助列 df = df.drop('ct_cum_sum', axis=1) print(df)
运行结果完全匹配期望输出1:
ATEXT BEGUZ_UE UE_more_days 0 11.00 NaN 1 CT 23.00 NaN 2 RT 33.00 56.0 3 15.00 NaN 4 12.75 NaN 5 19.75 NaN 6 14.75 NaN 7 CT 23.00 NaN 8 CT 24.00 NaN 9 CT 24.00 NaN 10 RT 33.00 104.0 11 15.00 NaN
扩展实现(接近输出2)
若要实现包含subtract、add、is_m_days的扩展输出,需明确这几列的计算规则,以下是基于示例逻辑的参考代码:
# 生成subtract和add列(示例值,需替换为你的真实规则) df['subtract'] = np.where(df['ATEXT'] == '', [0.00, 0.20, np.nan, np.nan, np.nan, 2.00, np.nan, np.nan, np.nan, np.nan, np.nan, 0.00], 0.00) df['add'] = np.where(df['ATEXT'] == '', [3.92, 0.00, np.nan, np.nan, np.nan, 0.00, np.nan, np.nan, np.nan, np.nan, np.nan, 3.57], 0.00) # 计算is_m_days:累计BEGUZ_UE + 累计add - 累计subtract df['is_m_days'] = (df['BEGUZ_UE'].cumsum() + df['add'].cumsum() - df['subtract'].cumsum()).where(df['ATEXT'] == '', np.nan) # 输出带格式强调的结果(仅用于展示,实际数据无需存储*) df_styled = df.style.applymap( lambda x, col: f'*{x}*' if (pd.notna(x) and (col in ['BEGUZ_UE', 'subtract', 'add', 'is_m_days'])) else x, col=df.columns ) print(df_styled.to_string())
内容的提问来源于stack exchange,提问作者mxplk
相关产品推荐
相关产品推荐

