Index¶
The .loc/[] operations can perform enlargement when setting a non-existent key for that axis.
df.drop vs df.droplevel¶
df.drop: Removes rows or columns based on labels or indices.df.droplevel: Drops levels from a multi-level index, simplifying it to a single-level index DataFrame.
get values vs slice rows¶
Singe value in index returns results excluding the index: Multiple values in index returns results including the index:cols to multiindex¶
get level values¶
get levle unique values¶
caveat: index.levels does not return updated contents if any rows or columns have been deleted. The MultiIndex keeps all the defined levels of an index, even if they are not actually used, to avoid a recomputation of the levels in order to make slicing highly performant.
df.index.levels[0] #fastest but should avoid to use, bad
df.index.levels[df.index.names.index('level_1')] #do not use it
df.index.get_level_values('Level_1').unique() #slow
df.index.unique(level='level_1') #suggested
get one value¶
df.index.values[1][0] #fastest
df.index.values[1][df.index.names.index('id')] #by level name
df.index[1][0] #fast
df.index.get_level_values(0)[1] #slow
rename levels¶
reorder levels¶
#custom reorder MultiIndex
mi = pd.MultiIndex.from_product([['Value'],regions,scens], names=[None,'Region','Scenario'])
df = df.reorder_levels([None,'Region','Scenario'], axis=0).reindex(mi) #index (default)
df = df.reorder_levels([None,'Region','Scenario'], axis=1).reindex(mi) #columns