如何按列表长度条件合并同列同索引的DataFrame并更新列?
实现需求的最优方法
假设两个DataFrame分别命名为df1和df2,列名均为a且索引完全一致。以下是两种高效的实现方式,优先推荐第一种掩码式写法(数据量大时性能更优):
方法一:基于布尔掩码的向量化替换
这种方式利用Pandas的向量化操作,避免逐行循环,在大数据量场景下性能更出色:
import pandas as pd # 构造示例数据(可替换为你的实际数据) df1 = pd.DataFrame({'a': [[], [1,2,3], [7]]}, index=[1,2,3]) df2 = pd.DataFrame({'a': [[5,2,7], [1,2,3,4], [7,5]]}, index=[1,2,3]) # 生成布尔掩码:标记df1中列表长度≤1的行 mask = df1['a'].apply(lambda x: len(x) <= 1) # 替换逻辑:掩码为True时用df2对应值,否则保留df1原值 result_df = df1['a'].mask(mask, df2['a']).to_frame()
方法二:逐行判断替换(直观易读)
如果数据量较小,这种写法更直观,便于理解逻辑:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'a': [[], [1,2,3], [7]]}, index=[1,2,3]) df2 = pd.DataFrame({'a': [[5,2,7], [1,2,3,4], [7,5]]}, index=[1,2,3]) # 逐行判断并替换 result_df = df1.apply( lambda row: df2.loc[row.name, 'a'] if len(row['a']) <= 1 else row['a'], axis=1 ).to_frame('a')
两种方法最终都会得到期望结果:
a 1 [5, 2, 7] 2 [1, 2, 3] 3 [7, 5]
内容的提问来源于stack exchange,提问作者FeoJun
相关产品推荐
相关产品推荐

