Панды - группировать по столбцам и преобразовывать данные в массив - PullRequest
0 голосов
/ 03 октября 2018

Имея следующий фрейм данных, группа A имеет 4 сэмпла, B 3 сэмпла и C 1 сэмпла:

  group   data_1   data_2
0     A        1        4
1     A        2        5
2     A        3        6
3     A        4        7
4     B        1        4
5     B        2        5
6     B        3        6
7     C        1        4

Я хотел бы преобразовать данные в массив Numpy, где каждая строка представляет собой группу свсе его выборки и заполнение нулями для групп, у которых меньше выборок.

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

[
   [[1,4],[2,5],[3,6],[4,7]], # this is A group 4 samples
   [[1,4],[2,5],[3,6],[0,0]], # this is B group 3 samples
   [[1,4],[0,0],[0,0],[0,0]], # this is C group 1 sample
]

1 Ответ

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

Сначала необходимо добавить пропущенные значения - первое решение с unstack и stack, счетчик Series создается как cumcount.

Второе решение использует reindex от MultiIndex.

Последнее использование лямбда-функции с groupby, преобразование в массив numy с помощью valuesи последнее в списках:

g = df.groupby('group').cumcount()
L = (df.set_index(['group',g])
       .unstack(fill_value=0)
       .stack().groupby(level=0)
       .apply(lambda x: x.values.tolist())
       .tolist())
print (L)

[[[1, 4], [2, 5], [3, 6], [4, 7]], 
 [[1, 4], [2, 5], [3, 6], [0, 0]], 
 [[1, 4], [0, 0], [0, 0], [0, 0]]]

Другое решение:

g = df.groupby('group').cumcount()
mux = pd.MultiIndex.from_product([df['group'].unique(), g.unique()])
L = (df.set_index(['group',g])
       .reindex(mux, fill_value=0)
       .groupby(level=0)['data_1','data_2']
       .apply(lambda x: x.values.tolist())
       .tolist()
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...