如何按索引相加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
相关产品推荐
相关产品推荐

