假设base_df
是如下所示的微小的数据帧:
In [221]: base_df
Out[221]:
seed
I S
0 a 0
b 1
1 a 2
b 3
注意base_df
具有2级多指数为行。 (部分问题涉及在传播的数据框中“传播”这个多索引的值)。
现在,函数fn
(定义在本文末尾给出)取整数seed
作为参数,并返回1按字符串键索引的列数据框。例如:
In [222]: fn(0)
Out[222]:
F
key
01011 0.592845
10100 0.844266
In [223]: fn(1)
Out[223]:
F
key
11110 0.997185
01000 0.932557
11100 0.128124
我要生成一个新的数据帧,在本质上,通过应用fn
到base_df
每一行,垂直串联产生的dataframes。更具体地,期望的结果是这样的:
F
I S key
0 a 01011 0.592845
10100 0.844266
b 11110 0.997185
01000 0.932557
11100 0.128124
1 a 01101 0.185082
01110 0.931541
b 00100 0.070725
11011 0.839949
11111 0.121329
11000 0.569311
IOW,概念上,是通过产生一个“子数据帧”为base_df
每一行,和垂直方向上串联这些子dataframes获得所需的数据帧。每行对应的子数据帧具有3级多索引。该多指数的前两个水平(I
和S
)来自该行的多指标值base_df
,而其最后一个水平(key
)以及(独立)F
列的值来自通过fn
为该行的seed
值返回的数据帧。
我不清楚的部分是如何将行的原始多索引值传播到fn
为该行的seed
值创建的数据框的行。
重要:我正在寻找一种方式来做到这一点是不可知的base_df
的多指标的层次的名称,和其数量。
我尝试以下
base_df.apply(lambda row: fn(row.seed), axis=1)
...但评估失败,错误
ValueError: Shape of passed values is (4, 2), indices imply (4, 1)
有一些简便的方法做我想要做什么?
下面是fn
的定义。就这个问题而言,它的内部是不重要的。重要的是,它需要一个整数seed
作为参数,并返回一个数据帧,如前所述。
import numpy
def fn(seed, _spec='{{0:0{0:d}b}}'.format(5)):
numpy.random.seed(int(seed))
n = numpy.random.randint(2, 5)
r = numpy.random.rand(n)
k = map(_spec.format, numpy.random.randint(0, 31, size=n))
result = pandas.DataFrame(r, columns=['F'], index=k)
result.index.name = 'key'
return result
在这个例子中,这些键发生,以对应于0和31(含)之间的一些整数的二进制表示,但这一事实起着问题没有作用。