Как удалить дополнительную копию дублирующего индекса серии Pandas?

У меня есть серия s с двойным индексом:

>>> s
STK_ID  RPT_Date
600809  20061231    demo_str
        20070331    demo_str
        20070630    demo_str
        20070930    demo_str
        20071231    demo_str
        20060331    demo_str
        20060630    demo_str
        20060930    demo_str
        20061231    demo_str
        20070331    demo_str
        20070630    demo_str
Name: STK_Name, Length: 11

И я просто хочу сохранить уникальные строки и только одну копию повторяющихся строк:

s[s.index.unique()]

Pandas 0.10.1.dev-f7f7e13 дают Pandas 0.10.1.dev-f7f7e13 ошибку: msg

>>> s[s.index.unique()]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "d:\Python27\lib\site-packages\pandas\core\series.py", line 515, in __getitem__
    return self._get_with(key)
  File "d:\Python27\lib\site-packages\pandas\core\series.py", line 558, in _get_with
    return self.reindex(key)
  File "d:\Python27\lib\site-packages\pandas\core\series.py", line 2361, in reindex
    level=level, limit=limit)
  File "d:\Python27\lib\site-packages\pandas\core\index.py", line 2063, in reindex
    limit=limit)
  File "d:\Python27\lib\site-packages\pandas\core\index.py", line 2021, in get_indexer
    raise Exception('Reindexing only valid with uniquely valued Index '
Exception: Reindexing only valid with uniquely valued Index objects
>>> 

Итак, как удалить лишние повторяющиеся ряды рядов, сохранить уникальные строки и только одну копию повторяющихся строк эффективным способом? (лучше в одной строке)

Ответ 1

Вы можете группировать по индексу и применять функцию, которая возвращает одно значение для группы индексов. Здесь я беру первое значение:

In [1]: s = Series(range(10), index=[1,2,2,2,5,6,7,7,7,8])

In [2]: s
Out[2]:
1    0
2    1
2    2
2    3
5    4
6    5
7    6
7    7
7    8
8    9

In [3]: s.groupby(s.index).first()
Out[3]:
1    0
2    1
5    4
6    5
7    6
8    9

ОБНОВИТЬ

Адресация комментария BigBug о сбое при передаче MultiIndex в Series.groupby():

In [1]: s
Out[1]:
STK_ID  RPT_Date
600809  20061231    demo
        20070331    demo
        20070630    demo
        20070331    demo

In [2]: s.reset_index().groupby(s.index.names).first()
Out[2]:
                    0
STK_ID RPT_Date
600809 20061231  demo
       20070331  demo
       20070630  demo

Ответ 2

Вы можете подмножить свои данные с duplicated (который сохраняет первое значение по умолчанию) для index. С примером @Zelazny7:

s = pd.Series(range(10), index=[1,2,2,2,5,6,7,7,7,8])

In [130]: s[~s.index.duplicated()]
Out[130]: 
1    0
2    1
5    4
6    5
7    6
8    9
dtype: int64

Ответ 3

Один из способов - использовать drop и index.get_duplicates:

In [43]: df
Out[43]: 
                      String
STK_ID RPT_Date             
600809 20061231  demo_string
       20070331  demo_string
       20070630  demo_string
       20070930  demo_string
       20071231  demo_string
       20060331  demo_string
       20060630  demo_string
       20060930  demo_string
       20061231  demo_string
       20070331  demo_string
       20070630  demo_string

In [44]: df.drop(df.index.get_duplicates())
Out[44]: 
                      String
STK_ID RPT_Date             
600809 20070930  demo_string
       20071231  demo_string
       20060331  demo_string
       20060630  demo_string
       20060930  demo_string