我创建了一个4级b树,每个叶子是Pandas系列,每个级别是一个基于True或False的2个值的系列。每个级别的系列都根据级别进行命名。结果是一个不太有用的对象,但创建起来很方便。下面的代码显示了如何创建一个类似(但更简单)的对象,该对象具有相同的基本财产。我真正想要的是一个MultiIndex数据帧,其中每个级别的索引都从该级别Series的相同名称继承其名称。
import random import pandas as pd def sertree(names): if len(names) <= 1: ga = pd.Series([random.randint(0,100) for x in range(5)], name='last') gb = pd.Series([random.randint(0,100) for x in range(5)], name='last') return pd.Series([ga,gb], index=[True,False], name=names[0]) else: xa = sertree(names[1:]) xb = sertree(names[1:]) return pd.Series([xa,xb], index=[True,False], name=names[0]) pp = sertree(['top', 'next', 'end']) n=4 while True: print(f"{'':>{n}s}{pp.name}") n+=4 if len(pp) > 2 : break pp = pp[True] top next end last
我想要的是这样的东西。。。
midx = pd.MultiIndex.from_product([top,nxt,end,last],names=['top','next','end','last']) ; midf = pd.DataFrame([random.randint(0,100) for x in range(len(midx))], index=midx, columns=['name']) In [593]: midf.head(12) Out[593]: name top next end last True True True 0 99 1 74 2 16 3 61 4 3 False 0 44 1 46 2 59 3 14 4 82 False True 0 98 1 93
任何想法如何将我讨厌的“pp”转换为一个漂亮的DataFrame多索引,用一个漂亮Pandas方法,我都无法理解。重要的是在每个级别将系列名称保持为多索引名称。