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)
代码解释
- 分组逻辑:用
df['ISIN'].str[:9]提取ISIN的前9位字符,和Date列一起作为分组键,确保只有前9位相同且日期一致的行才会被分到同一组。 - 分组处理函数:
- 先定位分组内ISIN第10位为"A"的行,获取其Value值;
- 如果存在这样的行,就把分组内所有ISIN第10位为"T"的行的Value减去这个"A"行的Value;
- 如果分组里没有"A"行,就保持所有行的Value不变(比如示例中
TRT010213T23在2019-12-20的行)。
- 保持原结构:
group_keys=False参数确保分组后不会额外添加分组键作为索引,处理后的DataFrame结构和原数据一致。
处理结果
运行代码后得到的结果和你要求的目标DataFrame完全一致:
| ISIN | Value | Date |
|---|---|---|
| TRT010213A15 | 10 | 2019-11-15 |
| TRT010213T23 | 90 | 2019-11-15 |
| TRT010213T23 | 70 | 2019-12-20 |
| TRT080328T15 | 150 | 2018-10-12 |
| TRT080420T12 | 175 | 2018-05-11 |
| TRT150120T16 | 150 | 2019-08-29 |
| TRT150120A05 | 15 | 2019-11-18 |
| TRT150120T16 | 300 | 2019-10-15 |
| TRT150120T16 | 260 | 2019-11-18 |
内容的提问来源于stack exchange,提问作者burhancigdem
相关产品推荐
相关产品推荐

