我尝试仅在一个级别上对具有两个或多个索引的数据帧重新索引,但是将.reindex()
与level
参数一起使用,正如我在this answer中看到的那样,似乎什么也没有做预期行为。
这是我尝试制作的代码:
import pandas as pd
dtest = pd.DataFrame([['Martin', 'room_1', 3],
['Martin', 'room_2', 2],
['Georges', 'room_2', 4],
['Georges', 'room_1', 12]],
columns=['name', 'room', 'time_spent'])
dtest.set_index(['name', 'room',], inplace=True)
display(dtest)
print(dtest.reindex(
['room_1', 'room_2', 'room_3'], level=1, fill_value=0))
输出
time_spent
name room
Martin room_1 3
room_2 2
Georges room_1 12
room_2 4
我期望的输出是
time_spent
name room
Martin room_1 3
room_2 2
room_3 0
Georges room_1 12
room_2 4
room_3 0
reindex()
实际上什么也没做。
我是否错过了使用reindex
的重要细节,还是有什么问题?
我正在使用Python 3.6.7的最新版本的熊猫(v3.6.7:6ec5cf24b7,2018年10月20日,03:02:14)。
答案 0 :(得分:1)
您将需要使用pd.MultiIndex.from_product()
和get_level_values
为此创建一个多索引:
mux=(pd.MultiIndex.from_product((dtest.index.get_level_values(0).unique()
,['room_1', 'room_2', 'room_3'])))
final=dtest.reindex(mux,fill_value=0)
time_spent
Martin room_1 3
room_2 2
room_3 0
Georges room_1 12
room_2 4
room_3 0
如果您只想添加带有现有索引的另一个索引,请在from_product()
arg中使用Index.union
:
mux=(pd.MultiIndex.from_product((dtest.index.get_level_values(0).unique()
,dtest.index.get_level_values(1).unique().union(['room3'],sort=False))))
final=dtest.reindex(mux,fill_value=0)
time_spent
Martin room_1 3
room_2 2
room_3 0
Georges room_1 12
room_2 4
room_3 0
使用stack()
添加另一个方法,并使用unstack()
添加swaplevel
:
final=dtest.unstack(0).reindex(['room_1', 'room_2', 'room_3']
,fill_value=0).stack().swaplevel().sort_index()
time_spent
name room
Georges room_1 12
room_2 4
room_3 0
Martin room_1 3
room_2 2
room_3 0