Python - Pandas, разбить длинный столбец на несколько столбцов - PullRequest
0 голосов
/ 28 ноября 2018

Учитывая следующий DataFrame:

>>> pd.DataFrame(data=[['a',1],['a',2],['b',3],['b',4],['c',5],['c',6],['d',7],['d',8],['d',9],['e',10]],columns=['key','value'])
  key  value
0   a      1
1   a      2
2   b      3
3   b      4
4   c      5
5   c      6
6   d      7
7   d      8
8   d      9
9   e     10

Я ищу метод, который изменит структуру на основе значения ключа, например:

   a  b  c  d   e
0  1  3  5  7  10
1  2  4  6  8  10 <- 10 is duplicated
2  2  4  6  9  10 <- 10 is duplicated

Строка результатачисло соответствует наибольшему количеству групп (в приведенном выше примере - d), а отсутствующие значения являются дубликатами последнего доступного значения.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Используя pivot, с groupby + cumcount

df.assign(key2=df.groupby('key').cumcount()).pivot('key2','key','value').ffill().astype(int)
Out[214]: 
key   a  b  c  d   e
key2                
0     1  3  5  7  10
1     2  4  6  8  10
2     2  4  6  9  10
0 голосов
/ 28 ноября 2018

Создать MultiIndex на set_index со столбцом счетчика на cumcount, изменить на unstack, отменить пропущенные значения последним отсутствующимс ffill и последним преобразованием всех данных в integer с при необходимости:

df = df.set_index([df.groupby('key').cumcount(),'key'])['value'].unstack().ffill().astype(int)

Другое решение с пользовательской лямбда-функцией:

df = (df.groupby('key')['value']
        .apply(lambda x: pd.Series(x.values))
        .unstack(0)
        .ffill()
        .astype(int))

print (df)
key  a  b  c  d   e
0    1  3  5  7  10
1    2  4  6  8  10
2    2  4  6  9  10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...