我想拍摄一个包含多索引和多列的pandas数据帧。我想找到第三个多索引循环列的最有效方法。我正在考虑拆堆,但我无法弄清楚如何通过该索引访问它们。有没有更好的方法(更快的处理方式):
df = pandas.DataFrame([{'Index_A':2018,'Index_B':0,'Index_C':101,'Col_D':0.3,'Col_E':.4},{'Index_A':2019,'Index_B':0,'Index_C':101,'Col_D':0.3,'Col_E':.4},{'Index_A':2019,'Index_B':0,'Index_C':102,'Col_D':0.3,'Col_E':.4}])
df = df.set_index(['Index_A','Index_B','Index_C'])
df = df.unstack()
for Index_C in [101,102]:
# get dataframe with index of ['Index_A','Index_B'] and columns ['Col_D,'Col_E']
答案 0 :(得分:2)
取每个值的横截面:
for i in df.index.levels[2].unique():
print(df.xs(i, level=2))
或者,如果不在索引中拥有第三级别并不重要,您可以这样做:
for i, j in df.groupby(level=2).groups.items():
print(df.loc[j])
答案 1 :(得分:0)
使用pd.DataFrame.query
的一种方式:
for i in df.index.get_level_values(2).unique():
print(df.query(f'Index_C == {i}'))
Col_D Col_E
Index_A Index_B Index_C
2018 0 101 0.3 0.4
2019 0 101 0.3 0.4
Col_D Col_E
Index_A Index_B Index_C
2019 0 102 0.3 0.4
如果你真的想放弃最终的MultiIndex
标签,你可以这样做:
for i in df.index.get_level_values(2).unique():
res = df.query(f'Index_C == {i}')
res.index = res.index.droplevel(2)
print(res)
Col_D Col_E
Index_A Index_B
2018 0 0.3 0.4
2019 0 0.3 0.4
Col_D Col_E
Index_A Index_B
2019 0 0.3 0.4