如何使用Pandas按两行一组交替合并两个DataFrame
如何使用Pandas按两行一组交替合并两个DataFrame
没问题,这需求用Pandas完全可以轻松实现!我给你两种实用的方法,一种好理解适合小数据场景,一种更高效适合大数据量,你可以按需选择~
首先先模拟你给出的两个DataFrame:
import pandas as pd import numpy as np # 你的第一个DataFrame df1 = pd.DataFrame({'column_1': [1, 2, 3, 4]}) # 你的第二个DataFrame df2 = pd.DataFrame({'column_1': [5, 6, 7, 8]})
方法一:分组拼接法(直观易懂)
思路很简单:先把两个DataFrame都按两行一组打上分组标签,然后依次把df1的每组和df2的对应组拼接起来,最后合并成结果。
# 给每个DataFrame添加分组标签:每两行归为一组 df1['group'] = np.arange(len(df1)) // 2 df2['group'] = np.arange(len(df2)) // 2 # 初始化空DataFrame存结果 result = pd.DataFrame() # 遍历每个分组,依次拼接df1和df2的对应组 for group_num in df1['group'].unique(): # 取出df1当前组的行 part_df1 = df1[df1['group'] == group_num] # 取出df2当前组的行 part_df2 = df2[df2['group'] == group_num] # 把这两部分拼到结果里 result = pd.concat([result, part_df1, part_df2], ignore_index=True) # 删掉辅助用的group列 result = result.drop('group', axis=1) print(result)
运行后就能得到你想要的结果:
column_1 0 1 1 2 2 5 3 6 4 3 5 4 6 7 7 8
方法二:无循环高效法(适合大数据)
如果你的DataFrame行数很多,循环会有点慢,那可以试试这种不需要循环的方法,利用排序来实现交替拼接:
# 给每个DataFrame添加两个辅助列:组号、组内位置(0或1,代表是组内第一行还是第二行) df1['group'] = np.arange(len(df1)) // 2 df1['pos'] = np.arange(len(df1)) % 2 df2['group'] = np.arange(len(df2)) // 2 df2['pos'] = np.arange(len(df2)) % 2 # 先把两个DataFrame合并到一起 combined = pd.concat([df1, df2]) # 按「组号」和「自定义位置优先级」排序:同一组内,先放df1的两行,再放df2的两行 result = combined.sort_values( by=['group', 'pos'], key=lambda x: x.map({0: 0, 1: 1}) if x.name == 'pos' else x ) # 重置索引并删除辅助列 result = result.reset_index(drop=True).drop(['group', 'pos'], axis=1) print(result)
运行后同样能得到目标结果,而且效率比循环高不少~
备注:内容来源于stack exchange,提问作者pinq-
相关产品推荐
相关产品推荐

