Pandas中基于c4值将每3行扁平合并为单行的实现方法
Pandas中基于c4值将每3行扁平合并为单行的实现方法
嘿,我来帮你搞定这个Pandas数据扁平化的需求!根据你描述的场景,我们可以通过分组+扁平化的方式来实现,这里有两种贴合你需求的方案:
方案一:按固定3行分组(适合数据严格按3行一组排列的情况)
如果你的数据是严格每3行对应一个目标行,不管c4的值,我们可以直接按索引整除3来分组:
import pandas as pd # 先构造你提供的原始DataFrame(修正了排版问题) data = { 'c1': [0, 1, 2, 3, 4, 5], 'c2': [1, 10, 100, 1, 10, 100], 'c3': [2, 20, 200, 2, 20, 200], 'c4': [3, 30, 300, 3, 30, 300] } df = pd.DataFrame(data) # 按每3行分成一组 grouped = df.groupby(df.index // 3) # 定义扁平化函数:把组内的所有行转成一维序列 def flatten_group(group): # 将组内数据转成一维数组 flattened_vals = group.values.flatten() # 生成新的列名(c1到cN) new_columns = [f'c{i+1}' for i in range(len(flattened_vals))] return pd.Series(flattened_vals, index=new_columns) # 应用函数并重置索引得到结果 result = grouped.apply(flatten_group).reset_index(drop=True) print(result)
运行后就能得到你想要的扁平格式,每组3行合并成一行。
方案二:基于c4的值分组(适合c4按0/1/2循环标记分组的情况)
如果你的分组逻辑是c4为0的行是每组的起始,后续c4=1、c4=2的行属于同一组,那我们可以用c4的取值来动态分组:
import pandas as pd # 构造带c4分组标识的原始数据 data = { 'c1': [0, 1, 2, 3, 4, 5], 'c2': [1, 10, 100, 1, 10, 100], 'c3': [2, 20, 200, 2, 20, 200], 'c4': [0, 1, 2, 0, 1, 2] # 这里c4是分组标记,0/1/2循环 } df = pd.DataFrame(data) # 用c4==0来标记新组的开始,生成分组ID df['group_id'] = (df['c4'] == 0).cumsum() - 1 # 分组后扁平化,同时去掉临时的group_id列 result = df.drop('group_id', axis=1).groupby(df['group_id']).apply( lambda x: pd.Series(x.values.flatten()) ).reset_index(drop=True) # 重命名列 result.columns = [f'c{i+1}' for i in range(result.shape[1])] print(result)
这个方案更灵活,即使数据的行数不是严格3的倍数,只要c4按0/1/2循环标记,就能正确分组合并。
小提示
如果你的目标输出不需要保留全部原始c1列(比如只保留每组第一行的c1,再合并其他行的c2/c3/c4列),可以在扁平化前先对组内数据做筛选,调整一下函数逻辑即可。
内容来源于stack exchange
相关产品推荐
相关产品推荐

