groupby大熊猫的联合结果

时间:2018-06-21 06:25:35

标签: python pandas

我提出这个问题是为了为自己学习一种新方法。

我有一个如下数据框,

    ID  Value
0    1     10
1    1     12
2    1     14
3    1     16
4    1     18
5    2     32
6    2     12
7    2     -8
8    2    -28
9    2    -48
10   2    -68
11   3     12
12   3      1
13   3     43

我想将其转换为:

    ID  Value  ID  Value   ID  Value
0  1.0   10.0   2     32  3.0   12.0
1  1.0   12.0   2     12  3.0    1.0
2  1.0   14.0   2     -8  3.0   43.0
3  1.0   16.0   2    -28  NaN    NaN
4  1.0   18.0   2    -48  NaN    NaN
5  NaN    NaN   2    -68  NaN    NaN

一种解决方法,

打印

pd.concat([df[df['ID']==1].reset_index(drop=True),df[df['ID']==2].reset_index(drop=True),df[df['ID']==3].reset_index(drop=True)],axis=1)

但是我在考虑可以对每个groupby方法结果执行相同的concat操作,而不是按值进行过滤吗?

任何更好/新的方法都会受到赞赏。

谢谢。

1 个答案:

答案 0 :(得分:2)

是的,实际上,使用pd.concat非常简单。

df = pd.concat({k : g.reset_index(drop=True) for k, g in df.groupby('ID')}, axis=1)
df.columns = df.columns.droplevel(0)

或者,Dark(现在已删除)答案中的一个小变化(这使您没有机会自动指定列后缀)-

pd.concat([g.reset_index(drop=True) for _, g in df.groupby('ID')], axis=1)

df 
    ID  Value  ID  Value   ID  Value
0  1.0   10.0   2     32  3.0   12.0
1  1.0   12.0   2     12  3.0    1.0
2  1.0   14.0   2     -8  3.0   43.0
3  1.0   16.0   2    -28  NaN    NaN
4  1.0   18.0   2    -48  NaN    NaN
5  NaN    NaN   2    -68  NaN    NaN

但是,那些列名很糟糕。与其删除第一级,不如考虑将它们串联起来以形成第二级的pre / suf-fix。使用df.columns.map对您来说应该是一个很好的练习。