How to reset a DataFrame's indexes for all groups in one step?

后端 未结 5 1541
猫巷女王i
猫巷女王i 2020-12-16 12:44

I\'ve tried to split my dataframe to groups

df = pd.DataFrame({\'A\' : [\'foo\', \'bar\', \'foo\', \'bar\',
                       \'foo\', \'bar\', \'foo\',         


        
相关标签:
5条回答
  • 2020-12-16 13:04

    Isn't this just grouped = grouped.apply(lambda x: x.reset_index()) ?

    0 讨论(0)
  • 2020-12-16 13:05

    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.

    0 讨论(0)
  • 2020-12-16 13:21
    df=df.groupby('A').apply(lambda x: x.reset_index(drop=True)).drop('A',axis=1).reset_index()
    
    0 讨论(0)
  • 2020-12-16 13:25

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

    0 讨论(0)
  • 2020-12-16 13:29
    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
    
    0 讨论(0)
提交回复
热议问题