如何用Python按7:3分块规则从两个DataFrame生成新DataFrame?
实现DataFrame分组合并排序的函数
思路说明
已知df_a(400行)和df_b(300行)均按score降序排列,需按每组7行df_a + 3行df_b的规则分组,每组合并后重新按score降序排序,最终拼接成700行的新DataFrame。由于df_a总行数仅400,无法达到700行的70%(需490行),因此优先用完所有df_a数据,再匹配剩余df_b数据,保证占比最大化。
代码实现
import pandas as pd def merge_sorted_dfs(df_a, df_b): # 存储每个分组处理后的结果 group_list = [] a_idx = 0 b_idx = 0 total_a = df_a.shape[0] total_b = df_b.shape[0] # 循环处理完整的7+3分组 while a_idx + 7 <= total_a: # 截取当前组的df_a和df_b片段 current_a = df_a.iloc[a_idx:a_idx+7] current_b = df_b.iloc[b_idx:b_idx+3] # 合并后按score降序排序 merged_group = pd.concat([current_a, current_b], axis=0).sort_values(by='score', ascending=False) group_list.append(merged_group) # 更新索引指针 a_idx += 7 b_idx += 3 # 处理df_a剩余的行(不足7行的部分) if a_idx < total_a: remaining_a = df_a.iloc[a_idx:] remaining_b = df_b.iloc[b_idx:] # 合并剩余数据并排序 final_group = pd.concat([remaining_a, remaining_b], axis=0).sort_values(by='score', ascending=False) group_list.append(final_group) # 拼接所有分组,生成最终DataFrame final_df = pd.concat(group_list, axis=0, ignore_index=True) return final_df
代码解释
- 循环处理完整分组:通过索引指针每次截取
df_a的7行和df_b的3行,合并后重新排序,确保每组内数据仍按score降序排列。 - 处理剩余数据:当
df_a剩余不足7行时,取出剩余所有df_a和df_b数据,合并排序后加入结果列表。 - 最终拼接:将所有分组结果拼接成一个完整的DataFrame,重置索引保证连续性。
内容的提问来源于stack exchange,提问作者vivi_program
相关产品推荐
相关产品推荐

