小能豆

使用 groupby 在 Python Pandas 中按列连接行

py

例如,我不想用 group_by 计算总和,而是想连接同一组内的所有行。下面的代码应该只合并/连接行,而不是使用 sum()。如果每组有 5 行,则新数据框的列数将是 5 倍(每列 x 5)

例如:这是我现在拥有的数据框。

Index    Pool   B          C         D           E
70       Pool1  8.717402   7.873173  16.029238   8.533174   
71       Pool1  7.376365   6.228181  9.272679    7.498993   
72       Pool2  8.854857   10.340896 9.218947    8.670379   
73       Pool2  11.509130  8.571492  19.363829   14.605199   
74       Pool3  14.780578  7.405982  9.279374    13.551686   
75       Pool3  7.448860   11.952275 8.239564    12.264440

我希望它像这样:

Index    Pool   B1         C1        D1          E1        B2         C2        D2          E2
70       Pool1  8.717402   7.873173  16.029238   8.533174  7.376365   6.228181  9.272679    7.498993  
71       Pool2  8.854857   10.340896 9.218947    8.670379  11.509130  8.571492  19.363829   14.605199  
72       Pool3  14.780578  7.405982  9.279374    13.551686 7.448860   11.952275 8.239564    12.264440  

我会为您提供示例代码,但不知道。如果我只对行进行求和,我会使用:

t.groupby(['pool']).sum()

但我不想合并行并保留列结构,我想将同一组的行连接起来。


阅读 16

收藏
2024-12-12

共1个答案

小能豆

要将行按组连接起来,并将其转换为具有新列结构的宽格式,可以使用 pandasgroupbyDataFrame.stack/unstack 的组合。以下是实现方法:


实现代码

import pandas as pd

# 示例数据
data = {
    'Index': [70, 71, 72, 73, 74, 75],
    'Pool': ['Pool1', 'Pool1', 'Pool2', 'Pool2', 'Pool3', 'Pool3'],
    'B': [8.717402, 7.376365, 8.854857, 11.509130, 14.780578, 7.448860],
    'C': [7.873173, 6.228181, 10.340896, 8.571492, 7.405982, 11.952275],
    'D': [16.029238, 9.272679, 9.218947, 19.363829, 9.279374, 8.239564],
    'E': [8.533174, 7.498993, 8.670379, 14.605199, 13.551686, 12.264440],
}

df = pd.DataFrame(data)

# 按组重置索引
grouped = df.groupby("Pool").apply(lambda g: g.iloc[:, 2:].reset_index(drop=True))

# 将每组行的索引转换为列后缀
result = grouped.unstack().sort_index(level=1, axis=1)
result.columns = [f"{col[0]}{col[1] + 1}" for col in result.columns]  # 设置列名
result.reset_index(inplace=True)

# 打印结果
print(result)

输出结果

    Pool         B1         C1         D1         E1         B2         C2         D2         E2
0  Pool1   8.717402   7.873173  16.029238   8.533174   7.376365   6.228181   9.272679   7.498993
1  Pool2   8.854857  10.340896   9.218947   8.670379  11.509130   8.571492  19.363829  14.605199
2  Pool3  14.780578   7.405982   9.279374  13.551686   7.448860  11.952275   8.239564  12.264440

实现步骤

  1. 按组重置索引
    使用 groupbyapply 将每组行保留,并对每组的行重新索引。

  2. 展开列(unstack
    将组内的行展平并堆叠到列中。每列会得到一个后缀表示第几行。

  3. 重命名列
    将多级列命名转换为扁平格式,例如 B1, C1, D1, B2, C2, 等。

  4. 重置索引
    通过 reset_indexPool 转换为常规列。


灵活性

  • 如果每组的行数不一致,则空值会被用 NaN 填充。
  • 支持多列处理,可以根据需要扩展。

额外说明

如果有更大的数据集,或对列的处理有特殊需求,例如仅选择特定列,可以通过调整代码轻松实现。例如:

df.iloc[:, [1, 3, 4]]  # 选择特定列进行处理
2024-12-12