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

如何基于条件对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:38:11