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

Pandas中按ISIN前缀与日期匹配计算Value列差值的方法

Pandas DataFrame按规则调整Value列的实现方案

嘿,这就帮你搞定这个Pandas数据处理需求!我写了一套清晰的步骤和代码,完美匹配你要的结果:

步骤说明

我们的核心思路是按ISIN前9位+日期分组,然后在每个分组内对第10位为"T"的行执行减法操作(减去同组内第10位为"A"的行的Value),"A"行的Value保持不变。

完整代码实现

首先我们先构造示例DataFrame(和你提供的一致),然后执行处理:

import pandas as pd

# 构造你提供的示例数据
data = {
    'ISIN': ['TRT010213A15', 'TRT010213T23', 'TRT010213T23', 'TRT080328T15', 'TRT080420T12',
             'TRT150120T16', 'TRT150120A05', 'TRT150120T16', 'TRT150120T16'],
    'Value': [10, 100, 70, 150, 175, 150, 15, 300, 275],
    'Date': ['2019-11-15', '2019-11-15', '2019-12-20', '2018-10-12', '2018-05-11',
             '2019-08-29', '2019-11-18', '2019-10-15', '2019-11-18']
}
df = pd.DataFrame(data)

# 定义分组处理函数
def adjust_group_values(group):
    # 获取当前分组中ISIN第10位为"A"的Value值(假设每组最多一个"A"行)
    a_value = group.loc[group['ISIN'].str[9] == 'A', 'Value'].values
    # 如果分组里存在"A"行,就对"T"行的Value做减法
    if len(a_value) > 0:
        group.loc[group['ISIN'].str[9] == 'T', 'Value'] -= a_value[0]
    return group

# 按ISIN前9位+Date分组,应用处理函数
result_df = df.groupby([df['ISIN'].str[:9], 'Date'], group_keys=False).apply(adjust_group_values)

# 查看处理后的结果
print(result_df)

代码解释

  1. 分组逻辑:用df['ISIN'].str[:9]提取ISIN的前9位字符,和Date列一起作为分组键,确保只有前9位相同且日期一致的行才会被分到同一组。
  2. 分组处理函数:
    • 先定位分组内ISIN第10位为"A"的行,获取其Value值;
    • 如果存在这样的行,就把分组内所有ISIN第10位为"T"的行的Value减去这个"A"行的Value;
    • 如果分组里没有"A"行,就保持所有行的Value不变(比如示例中TRT010213T23在2019-12-20的行)。
  3. 保持原结构:group_keys=False参数确保分组后不会额外添加分组键作为索引,处理后的DataFrame结构和原数据一致。

处理结果

运行代码后得到的结果和你要求的目标DataFrame完全一致:

ISINValueDate
TRT010213A15102019-11-15
TRT010213T23902019-11-15
TRT010213T23702019-12-20
TRT080328T151502018-10-12
TRT080420T121752018-05-11
TRT150120T161502019-08-29
TRT150120A05152019-11-18
TRT150120T163002019-10-15
TRT150120T162602019-11-18

内容的提问来源于stack exchange,提问作者burhancigdem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:48:10