例如,我不想用 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()
但我不想合并行并保留列结构,我想将同一组的行连接起来。
要将行按组连接起来,并将其转换为具有新列结构的宽格式,可以使用 pandas 的 groupby 和 DataFrame.stack/unstack 的组合。以下是实现方法:
pandas
groupby
DataFrame.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
按组重置索引: 使用 groupby 和 apply 将每组行保留,并对每组的行重新索引。
apply
展开列(unstack): 将组内的行展平并堆叠到列中。每列会得到一个后缀表示第几行。
unstack
重命名列: 将多级列命名转换为扁平格式,例如 B1, C1, D1, B2, C2, 等。
B1
C1
D1
B2
C2
重置索引: 通过 reset_index 将 Pool 转换为常规列。
reset_index
Pool
NaN
如果有更大的数据集,或对列的处理有特殊需求,例如仅选择特定列,可以通过调整代码轻松实现。例如:
df.iloc[:, [1, 3, 4]] # 选择特定列进行处理