Для меня неясно, хотите ли вы, чтобы результат был в виде фрейма данных или диктовался с «индексом» в качестве ключей или просто в виде списка с элементами в правильном порядке. Кстати, списки Python начинаются с индекса 0
.
In [706]: result = collections.defaultdict(list)
...: for id, dfs in df.groupby('id'):
...: result[id].extend(list(dfs['value'].values))
...:
In [707]: result # this will be a dict
Out[707]:
defaultdict(list,
{1: [30, 21, 12, 0], 2: [1, 9, 14], 3: [12, 2], 4: [3], 5: [1]})
In [708]: [result[k] for k in sorted(result.keys())] # turn it into a list
Out[708]: [[30, 21, 12, 0], [1, 9, 14], [12, 2], [3], [1]]
Если вы хотите применить некоторую операцию к каждому элементу в группе, как вы делаете с helper()
, вы можете сделать:
In [714]: def helper(val):
...: return 'x' + str(val) # simplifying whatever helper does
In [715]: result = collections.defaultdict(list)
...: for id, dfs in df.groupby('id'):
...: result[id].extend(map(helper, dfs['value'].values)) # pass each value to helper
In [716]: result
Out[716]:
defaultdict(list,
{1: ['x30', 'x21', 'x12', 'x0'],
2: ['x1', 'x9', 'x14'],
3: ['x12', 'x2'],
4: ['x3'],
5: ['x1']})
In [717]: [result[k] for k in sorted(result.keys())]
Out[717]:
[['x30', 'x21', 'x12', 'x0'],
['x1', 'x9', 'x14'],
['x12', 'x2'],
['x3'],
['x1']]
Обратите внимание, что result[id].extend(...)
на самом деле не требуется, поскольку каждая группа значений для этого 'id'
будет передаваться вместе. Поэтому вам не нужно проверять, существует ли id
в результате. Это могло быть просто:
In [720]: result = collections.defaultdict(list)
...: for id, dfs in df.groupby('id'):
...: result[id] = list(map(helper, dfs['value'].values))
В идеале вам нужно создать helper
, чтобы его можно было использовать с pd.apply()
, работая со всеми строками dfs
вместе.
Или, что еще лучше, создайте helper
, чтобы он мог что-то делать с кадром данных каждого groupby
результата через pd.groupby.GroupBy.apply()
.