pandas groupby транспонировать столбец str - PullRequest
0 голосов
/ 06 октября 2018

вот что я пытаюсь сделать:

>>>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

как транспонировать столбец 'b', сгруппированный по столбцу 'a', чтобы вывод был похож на:

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

Ответы [ 4 ]

0 голосов
/ 06 октября 2018

Учитывая порядок ваших 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
0 голосов
/ 06 октября 2018

Вы можете попробовать сгруппировать по столбцам и сгладить значения, связанные с группой, и переформатировать его как фрейм данных

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

Out:

    B0  B1  B2
a           
1   a   a   b
2   c   d   e
3   f   None    None
0 голосов
/ 06 октября 2018

Использование pivot_table с cumcount:

(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
0 голосов
/ 06 октября 2018

вы могли бы попробовать что-то вроде этого:

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...