我有一个pandas.Series对象,其分层索引由两个级别组成:(代码,日期)。我还有一张地图{date - >码}。我希望获得一个仅按日期编制索引的系列,这样每个日期都会在提供的地图中查找代码,然后在原始系列中查找该对(代码,日期)。在熊猫中实现这一目标的最佳途径是什么? 非常感谢您的帮助。
答案 0 :(得分:2)
简答:通常NDFrame(如系列)按标签编制索引。但也可以通过索引索引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中形成第二个MultiIndex:
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