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

时间:2016-01-06 13:21:40

标签: python pandas

而不是例如用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()

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

1 个答案:

答案 0 :(得分:1)

你可以尝试:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Pool': ['a', 'a', 'b', 'b', 'c'], 'B':[1, 2, 3, 4, 5], 'C':[1,2,3,4,5]})
gd = df1.groupby('Pool')

def comb2(x):
    rslt = dict()
    for col in x.columns:
        rslt[col]=x[col].tolist()
    return pd.Series(rslt)

rslt = gd.apply(comb2)
rslt = rslt.drop('Pool', axis=1)
finaldf = pd.DataFrame()
for col in rslt.columns:
    tempdf = rslt[col].apply(lambda x: pd.Series(x))
    tempdf.columns  = [col+str(i+1) for i in range(len(tempdf.columns))]
    finaldf = pd.concat([finaldf, tempdf],axis=1)

print(finaldf)

Output:
      B1  B2  C1  C2
Pool                
a      1   2   1   2
b      3   4   3   4
c      5 NaN   5 NaN