2017-07-01 67 views
2

玩具例如应用数据帧返回函数以碱数据帧中的每一行

假设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 

我要生成一个新的数据帧,在本质上,通过应用fnbase_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级多索引。该多指数的前两个水平(IS)来自该行的多指标值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(含)之间的一些整数的二进制表示,但这一事实起着问题没有作用。

回答

5

选项1
groupby

base_df.groupby(level=[0, 1]).apply(fn) 

        F 
I S key    
0 a 11010 0.385245 
    00010 0.890244 
    00101 0.040484 
    b 01001 0.569204 
    11011 0.802265 
    00100 0.063107 
1 a 00100 0.947827 
    00100 0.056551 
    11000 0.084872 
    b 11110 0.592641 
    00110 0.130423 
    11101 0.915945 

选项2
pd.concat

pd.concat({t.Index: fn(t.seed) for t in base_df.itertuples()}) 

        F 
    key    
0 a 11011 0.592845 
    00011 0.844266 
    b 00101 0.997185 
    01111 0.932557 
    00000 0.128124 
1 a 01011 0.185082 
    10010 0.931541 
    b 10011 0.070725 
    01010 0.839949 
    01011 0.121329 
    11001 0.569311 
相关问题