不同长度DataFrame分组对比:每24行df1对应1行df2
DataFrame按组匹配长度对比的实现方法
问题背景
- 两个长度不同的DataFrame:
len(df1) = 2400len(df2) = 100
df1结构:
colA colB colC 0 1 2 3 4 5 6 7 8 ... 2400 rows.
df2结构:
colD colE colF 10 11 12 13 14 15 ... 100 rows
执行对比操作df1['colB'] > df2['colD']时,出现长度不匹配错误:
ValueError: ('Lengths must match to compare', (2400,), (100,))
需求:实现连续24行df1对应1行df2的对比(df1第1-24行对应df2第1行,第25-48行对应df2第2行,以此类推),仅对比colB与colD列。
解决方案
方法1:扩展df2至与df1同长度
直接将df2的每行重复24次,使其长度与df1一致,再执行对比:
# 扩展df2的colD列,每行重复24次 df2_colD_expanded = df2['colD'].repeat(24).reset_index(drop=True) # 执行对比操作 comparison_result = df1['colB'] > df2_colD_expanded
repeat(24):将colD的每个元素重复24次reset_index(drop=True):重置索引,保证和df1的索引完全对齐
方法2:分组匹配(无需扩展行)
通过给df1添加分组标识,和df2的索引对应后再合并对比:
# 给df1添加分组ID:每24行一组,组号从0到99(对应df2的索引) df1['group_id'] = df1.index // 24 # 给df2添加对应分组ID df2['group_id'] = df2.index # 按group_id合并,将df2的colD匹配到对应组的df1行 merged_df = df1.merge(df2[['group_id', 'colD']], on='group_id', how='left') # 执行对比 comparison_result = merged_df['colB'] > merged_df['colD'] # 可选:删除临时添加的group_id列 merged_df.drop('group_id', axis=1, inplace=True)
方法3:使用Numpy广播(高效简洁)
利用Numpy的数组变形和广播特性,直接完成分组对比:
import numpy as np # 将df1的colB转为24行一组的二维数组,df2的colD转为列向量后广播对比 comparison_matrix = df1['colB'].values.reshape(-1, 24) > df2['colD'].values[:, np.newaxis] # 将二维结果转为和df1同长度的一维数组 comparison_result = comparison_matrix.flatten()
reshape(-1, 24):把df1的colB拆成100组,每组24个元素[:, np.newaxis]:把df2的colD转为列向量,让Numpy自动广播到每组的24个元素上
内容的提问来源于stack exchange,提问作者devcodes
相关产品推荐
相关产品推荐

