Как удалить дополнительную копию дублирующего индекса серии 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