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

如何对含字符串与数值列的两个DataFrame做减法并保留字符串列?

解决混合类型DataFrame数值列减法并保留字符串列的问题

直接执行df2 - df1报错是因为pandas会尝试对所有列做减法运算,而字符串列不支持减法操作。下面是几种可行的解决方法:

方法一:分离数值列与非数值列操作

  1. 筛选出两个DataFrame中的数值列
  2. 对数值列执行减法运算
  3. 将原DataFrame的非数值列(字符串列)与差值结果合并
import pandas as pd

# 定义原DataFrame(用户提供的示例)
df1 = pd.DataFrame({'col1': ['A', 'B', 'C'],
                    'col2': ['black berry','green apple','red wine'],
                   'col3':['black', 'green','red' ],
                   'data1':[2,2,2],
                    'data2':[2,2,2],
                    'data3':[5,5,5]
                   })
df2 = pd.DataFrame({'col1': ['A', 'B', 'C'],
                    'col2': ['black berry','green apple','red wine'],
                   'col3':['black', 'green','red' ],
                   'data1':[1,2,2],
                    'data2':[2,1,3],
                    'data3':[3,2,1]
                   })

# 提取数值列
numeric_cols = df1.select_dtypes(include='number').columns
# 计算数值列差值
diff_numeric = df2[numeric_cols] - df1[numeric_cols]
# 合并字符串列与差值列
df3 = pd.concat([df1.drop(numeric_cols, axis=1), diff_numeric], axis=1)
print(df3)

输出结果:

col1         col2   col3  data1  data2  data3
0    A  black berry  black     -1      0     -2
1    B  green apple  green      0     -1     -3
2    C     red wine    red      0      1     -4

方法二:基于列名前缀筛选数据列

如果数值列有统一命名规则(比如示例中的data前缀),可以直接通过列名筛选:

# 筛选以data开头的列
data_cols = [col for col in df1.columns if col.startswith('data')]
# 复制字符串列作为基础,再添加差值列
df3 = df1.drop(data_cols, axis=1).copy()
df3[data_cols] = df2[data_cols] - df1[data_cols]

方法三:将字符串列设为索引后运算

如果字符串列是行的唯一标识且两个DataFrame对应行完全匹配,可以先将其设为索引,做完减法后再重置索引:

# 设置字符串列为索引
df1_indexed = df1.set_index(['col1', 'col2', 'col3'])
df2_indexed = df2.set_index(['col1', 'col2', 'col3'])
# 执行减法(仅数值列参与运算)
diff_indexed = df2_indexed - df1_indexed
# 重置索引恢复字符串列
df3 = diff_indexed.reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:08:21