2015-03-24 5 views
2

У меня есть объект pandas.Series с иерархическим индексом, состоящим из двух уровней: (код, дата). У меня также есть карта {date -> code}. Я хотел бы получить серию, индексированную только по дате, так что для каждой даты код просматривается на предоставленной карте, а затем пара (код, дата) просматривается в исходной серии. Каков наилучший способ добиться этого в Пандах? Большое спасибо за вашу помощь.Необычное индексирование в pandas

ответ

2

Короткий ответ: Обычно NDFrames (такие как Series) индексируются по метке. Но также можно индексировать NDFrame по индексу. То есть, вы можете индексировать NDFrame, используя индекс!

Итак, преобразуйте dict в MultiIndex. Используйте MultiIndex для выбора строк из серии : series[index].


Предположим, что ваша серия выглядит следующим образом:

import numpy as np 
import pandas as pd 
np.random.seed(0) 

N, M = 3, 5 
big_dates = pd.date_range('2000-1-1', periods=M, freq='D') 
index = pd.MultiIndex.from_product([np.arange(N), big_dates]) 
series = pd.Series(np.random.randint(10, size=N*M), index=index) 
print(series) 
# 0 2000-01-01 5 
# 2000-01-02 0 
# 2000-01-03 3 
# 2000-01-04 3 
# 2000-01-05 7 
# 1 2000-01-01 9 
# 2000-01-02 3 
# 2000-01-03 5 
# 2000-01-04 2 
# 2000-01-05 4 
# 2 2000-01-01 7 
# 2000-01-02 6 
# 2000-01-03 8 
# 2000-01-04 8 
# 2000-01-05 1 
# dtype: int64 

и пусть Dict (назовем его codemap) выглядит следующим образом:

dates = pd.date_range('2000-1-1', periods=N, freq='D') 
codes = np.arange(N) 
np.random.shuffle(codes) 
codemap = dict(zip(dates, codes)) 
# {Timestamp('2000-01-01 00:00:00', offset='D'): 0, 
# Timestamp('2000-01-02 00:00:00', offset='D'): 1, 
# Timestamp('2000-01-03 00:00:00', offset='D'): 2} 

, то вы можете сформировать второй мультииндексных из от codemap dict:

codemap_index = pd.MultiIndex.from_arrays([codemap.values(), codemap.keys()]) 

и использовать его для индексации серии:

result = series[codemap_index] 
# 0 2000-01-01 5 
# 1 2000-01-02 3 
# 2 2000-01-03 8 
# dtype: int64 

Наконец, использование droplevel удалить уровень кода в индексе:

result.index = result.index.droplevel(0) 
print(result) 

дает

2000-01-01 5 
2000-01-02 3 
2000-01-03 8 
dtype: int64 
+0

Awesome! Большое спасибо, Ubuntu. Я не знал, что я могу использовать индекс для индексации серии. –

Смежные вопросы