You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 06:54:31