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

如何按索引相加Pandas DataFrame,忽略字符串列并设置填充值为0?

按索引合并Pandas DataFrame并仅对数值列求和

问题场景

现有两个以Surname为索引的DataFrame,需要基于索引合并:仅对**数值列(如Age)**求和,非数值列(如Name)保留对应索引的取值;同时对仅在单个DataFrame中存在的索引,求和时用0填充,最终得到如示例df3的结果。

示例数据:

import pandas as pd

df1 = pd.DataFrame.from_dict({
    "Surname" : ["Adams", "Sallings", "Teezle"], 
    "Name" : ["Frank", "Jim", "John"], 
    "Age" : [23, 53, 33]
}).set_index("Surname")

df2 = pd.DataFrame.from_dict({
    "Surname" : ["Adams", "Sallings", "Watting"], 
    "Name" : ["Frank", "Jim", "John"], 
    "Age" : [23, 53, 33]
}).set_index("Surname")

# 期望输出的目标结果
df3 = pd.DataFrame.from_dict({
    "Surname" : ["Adams", "Sallings", "Teezle", "Watting"], 
    "Name" : ["Frank", "Jim", "John", "John"], 
    "Age" : [46, 106, 33, 33]
}).set_index("Surname")

直接使用df.add(df2, fill_value=0)会报错,因为无法将0与字符串类型的Name列拼接。


解决方案

方法1:分离数值列与非数值列处理

先提取数值列完成求和操作,再合并非数值列的对应取值:

# 1. 筛选数值列并执行求和,fill_value=0处理单索引项
numeric_cols = df1.select_dtypes(include='number').columns
summed_numeric = df1[numeric_cols].add(df2[numeric_cols], fill_value=0)

# 2. 合并非数值列,优先保留df1的取值,df1无对应索引则取df2的值
non_numeric_cols = df1.select_dtypes(exclude='number').columns
combined_non_numeric = df1[non_numeric_cols].combine_first(df2[non_numeric_cols])

# 3. 拼接两部分结果
result = pd.concat([combined_non_numeric, summed_numeric], axis=1)

方法2:concat拼接后分组处理

将两个DataFrame纵向拼接,按索引分组后对不同类型列分别处理:

# 纵向拼接两个DataFrame
combined = pd.concat([df1, df2])

# 按索引分组,数值列求和、非数值列取第一个有效值
result = combined.groupby(combined.index).agg(
    {col: 'sum' if pd.api.types.is_numeric_dtype(combined[col]) else 'first' for col in combined.columns}
)

两种方法最终都能得到与df3一致的输出:

Name  Age
Surname             
Adams     Frank   46
Sallings    Jim  106
Teezle     John   33
Watting    John   33

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:55:20