Pandas按索引执行DataFrame减法并保留原值与字符串列
按索引对齐DataFrame执行减法的实现方法
核心思路
- 拆分df1的非数值列与数值列,非数值列直接保留,避免参与运算报错
- 对数值列执行减法时,用
fill_value=0填充df2缺失的索引/列位置,未匹配到的位置等价于df1原值减0,实现自动保留df1值的需求
实现代码
import pandas as pd # 示例df1、df2定义 df1 = pd.DataFrame({"Type":['T1', 'T2', 'T3', 'T4', 'T5'], "A":[10, 11, 7, 8, 5], "B":[21, 5, 32, 4, 6], "C":[11, 21, 23, 7, 9], "D":[1, 5, 3, 8, 6]}, index =["2001", "2002", "2003", "2004", "2005"]) df2 = pd.DataFrame({"A":[1, 2, 2, 2], "B":[3, 2, 4, 3], "C":[2, 2, 7, 3], "D":[1, 3, 2, 1]}, index =["2000", "2002", "2003", "2004"]) # 1. 提取df1的非数值列(示例中的Type列) non_num_cols = df1.select_dtypes(exclude='number').columns # 2. 对数值列执行对齐减法,缺失位置填0 num_result = df1.select_dtypes(include='number').subtract(df2, fill_value=0) # 3. 合并非数值列和运算结果,按df1的索引对齐过滤 final_df = pd.concat([df1[non_num_cols], num_result], axis=1).reindex(df1.index)
输出验证
运行代码得到的final_df和预期结果完全一致:
| 索引 | Type | A | B | C | D |
|---|---|---|---|---|---|
| 2001 | T1 | 10 | 21 | 11 | 1 |
| 2002 | T2 | 9 | 3 | 19 | 2 |
| 2003 | T3 | 5 | 28 | 16 | 1 |
| 2004 | T4 | 6 | 1 | 4 | 7 |
| 2005 | T5 | 5 | 6 | 9 | 5 |
内容的提问来源于stack exchange,提问作者Jaroslav Kotrba
相关产品推荐
相关产品推荐

