I\'ve tried to split my dataframe to groups
df = pd.DataFrame({\'A\' : [\'foo\', \'bar\', \'foo\', \'bar\',
\'foo\', \'bar\', \'foo\',
Isn't this just grouped = grouped.apply(lambda x: x.reset_index())
?
Something like this would work:
for group, index in grouped.indices.iteritems():
grouped.indices[group] = range(0, len(index))
You could probably make it less verbose if you wanted to.
df=df.groupby('A').apply(lambda x: x.reset_index(drop=True)).drop('A',axis=1).reset_index()
Pass in as_index=False
to the groupby, then you don't need to reset_index
to make the groupby-d columns columns again:
In [11]: grouped = df.groupby('A', as_index=False)
In [12]: grouped.get_group('foo')
Out[12]:
A B
0 foo 1
2 foo 3
4 foo 5
6 foo 7
7 foo 8
Note: As pointed out (and seen in the above example) the index above is not [0, 1, 2, ...]
, I claim that this will never matter in practice - if it does you're going to have to just through some strange hoops - it's going to be more verbose, less readable and less efficient...
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['1', '2', '3', '4',
'5', '6', '7', '8'],
})
grouped = df.groupby('A',as_index = False)
we get two groups
grouped_index = grouped.apply(lambda x: x.reset_index(drop = True)).reset_index()
Result in two new columns level_0 and level_1 getting added and the index is reset
level_0level_1 A B
0 0 0 bar 2
1 0 1 bar 4
2 0 2 bar 6
3 1 0 foo 1
4 1 1 foo 3
5 1 2 foo 5
6 1 3 foo 7
7 1 4 foo 8
result = grouped_index.drop('level_0',axis = 1).set_index('level_1')
Creates an index within each group of "A"
A B
level_1
0 bar 2
1 bar 4
2 bar 6
0 foo 1
1 foo 3
2 foo 5
3 foo 7
4 foo 8