如何对含字符串与数值列的两个DataFrame做减法并保留字符串列?
解决混合类型DataFrame数值列减法并保留字符串列的问题
直接执行df2 - df1报错是因为pandas会尝试对所有列做减法运算,而字符串列不支持减法操作。下面是几种可行的解决方法:
方法一:分离数值列与非数值列操作
- 筛选出两个DataFrame中的数值列
- 对数值列执行减法运算
- 将原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
相关产品推荐
相关产品推荐

