如何基于另一DataFrame高效实现DataFrame的透视与分组?
高效解决方案
以下两种方案均采用向量化操作,完全避免逐行循环,处理百万级数据的速度会有数量级的提升。
方案一:基于Pandas的长格式转换+分组聚合
利用melt将宽表转长表,合并后按行索引和日期分组求和,最后转回宽表:
import pandas as pd # 重置索引,保留原行号用于分组 df1_melt = df1.reset_index().melt(id_vars='index', var_name='col', value_name='value') df2_melt = df2.reset_index().melt(id_vars='index', var_name='col', value_name='date') # 合并两个长表,关联数值和对应日期 merged = pd.merge(df1_melt, df2_melt, on=['index', 'col']) # 按原行号+日期分组求和,再转回宽表 result = merged.groupby(['index', 'date'])['value'].sum().unstack(fill_value=pd.NA) # 恢复原索引结构 result = result.reset_index(drop=True) # 可选:按日期排序,与示例输出格式对齐 result = result[sorted(result.columns)]
方案二:基于NumPy的向量化运算
直接利用NumPy的广播和条件筛选,速度比方案一更优,适合超大规模数据集:
import pandas as pd import numpy as np # 获取所有唯一日期,作为结果的列 unique_dates = np.unique(df2.values.ravel()) # 初始化结果数组,默认填充NaN result_array = np.full((len(df1), len(unique_dates)), np.nan) # 遍历每个日期,计算每行对应日期的数值和 for idx, date in enumerate(unique_dates): # 筛选df2中等于当前日期的位置,对df1对应值按行求和 result_array[:, idx] = df1.where(df2 == date).sum(axis=1) # 转换为DataFrame并按日期排序 df_result = pd.DataFrame(result_array, columns=unique_dates) df_result = df_result[sorted(unique_dates)]
内容的提问来源于stack exchange,提问作者np2020
相关产品推荐
相关产品推荐

