熊猫groupby转置str栏

时间:2018-10-06 16:12:51

标签: python pandas dataframe pivot transpose

这是我想要做的:

>>>import pandas as pd
>>>dftemp = pd.DataFrame({'a': [1] * 3 + [2] * 3, 'b': 'a a b c d e'.split()})
    a   b
0   1   a
1   1   a
2   1   b
3   2   c
4   2   d
5   2   e
6   3   f

如何对按列“ a”分组的“ b”列进行转置,以使输出如下所示:

    a   b0 b1  b2
0   1   a  a   b
3   2   c  d   e
6   3   f  NaN NaN

4 个答案:

答案 0 :(得分:3)

pivot_tablecumcount一起使用:

(df.assign(flag=df.groupby('a').b.cumcount())
    .pivot_table(index='a', columns='flag', values='b', aggfunc='first')
    .add_prefix('B'))

flag B0   B1   B2
a
1     a    a    b
2     c    d    e
3     f  NaN  NaN

答案 1 :(得分:1)

您可以尝试按列分组并展平与group关联的值,然后将其重新构造为数据框

df = df.groupby(['a'])['b'].apply(lambda x: x.values.flatten())
pd.DataFrame(df.values.tolist(),index=df.index).add_prefix('B')

出局:

    B0  B1  B2
a           
1   a   a   b
2   c   d   e
3   f   None    None

答案 2 :(得分:0)

您可能可以尝试这样的事情:

>>> dftemp = pd.DataFrame({'a': [1] * 3 + [2] * 2 + [3]*1, 'b': 'a a b c d e'.split()})
>>> dftemp
   a  b
0  1  a
1  1  a
2  1  b
3  2  c
4  2  d
5  3  e
>>> dftemp.groupby('a')['b'].apply(lambda df: df.reset_index(drop=True)).unstack()
   0     1     2
a
1  a     a     b
2  c     d  None
3  e  None  None

答案 3 :(得分:0)

根据DataFrame的顺序,您可以找到组的更改位置,然后使用np.split创建新的DataFrame

import numpy as np
import pandas as pd

splits = dftemp[(dftemp.a != dftemp.a.shift())].index.values

df = pd.DataFrame(np.split(dftemp.b.values, splits[1:])).add_prefix('b').fillna(np.NaN)
df['a'] = dftemp.loc[splits, 'a'].values

输出

  b0   b1   b2  a
0  a    a    b  1
1  c    d    e  2
2  f  NaN  NaN  3