Pandas重复索引仍显示正确的元素

时间:2016-06-02 18:56:29

标签: python pandas

我有一只像这样的大熊猫DataFrame

test = pd.DataFrame({'score1' : pandas.Series(['a', 'b', 'c', 'd', 'e']), 'score2' : pandas.Series(['b', 'a', 'k', 'n', 'c'])})

输出:

  score1  score2
0   a       b
1   b       a
2   c       k
3   d       n
4   e       c

然后,我将score1score2列拆分并将它们连接在一起:

In (283): frame1 = test[['score1']]
          frame2 = test[['score2']]
          frame2.rename(columns={'score2': 'score1'}, inplace=True)

          test = pandas.concat([frame1, frame2])

          test

Out[283]:   
   score1
0   a
1   b
2   c
3   d
4   e
0   b
1   a
2   k
3   n
4   c

请注意重复索引。现在,如果我执行groupby然后使用get_group()检索组,则pandas仍然可以检索具有正确索引的元素,即使索引是重复的!

In (283): groups = test.groupby('score1')

          groups.get_group('a') # Get group with key a

Out[283]: 
    score1
0   a
1   a

In (283): groups.get_group('b') # Get group with key b

Out[283]: 
    score1
1   b
0   b

据我所知,pandas使用倒排索引数据结构来存储组,如下所示:

In (284): groups.groups

Out[284]: {'a': [0, 1], 'b': [1, 0], 'c': [2, 4], 'd': [3], 'e': [4], 'k': [2], 'n': [3]}

如果ab都存储在索引0,那么当我get_group()时,pandas如何正确显示元素?

1 个答案:

答案 0 :(得分:0)

这是进入内部的(即,不依赖于这个API!)但它现在的工作方式是有一个Grouping对象存储组的位置,而不是索引标签

In [25]: gb = test.groupby('score1')

In [26]: gb.grouper
Out[26]: <pandas.core.groupby.BaseGrouper at 0x4162b70>

In [27]: gb.grouper.groupings
Out[27]: [Grouping(score1)]

In [28]: gb.grouper.groupings[0]
Out[28]: Grouping(score1)

In [29]: gb.grouper.groupings[0].indices
Out[29]: 
{'a': array([0, 6], dtype=int64),
 'b': array([1, 5], dtype=int64),
 'c': array([2, 9], dtype=int64),
 'd': array([3], dtype=int64),
 'e': array([4], dtype=int64),
 'k': array([7], dtype=int64),
 'n': array([8], dtype=int64)}

请在此处查看实际实施的位置。 https://github.com/pydata/pandas/blob/master/pandas/core/groupby.py#L2091