如何将输出的多个值分配给数据框的新多个列?

时间:2019-07-16 05:07:47

标签: pandas apply

我具有以下功能:

def sum(x):
    oneS = x.iloc[0:len(x)//10].agg('sum')
    twoS = x.iloc[len(x)//10:2*len(x)//10].agg('sum')
    threeS = x.iloc[2*len(x)//10:3*len(x)//10].agg('sum')
    fourS = x.iloc[3*len(x)//10:4*len(x)//10].agg('sum')
    fiveS = x.iloc[4*len(x)//10:5*len(x)//10].agg('sum')
    sixS = x.iloc[5*len(x)//10:6*len(x)//10].agg('sum')
    sevenS = x.iloc[6*len(x)//10:7*len(x)//10].agg('sum')
    eightS = x.iloc[7*len(x)//10:8*len(x)//10].agg('sum')
    nineS = x.iloc[8*len(x)//10:9*len(x)//10].agg('sum')
    tenS = x.iloc[9*len(x)//10:len(x)//10].agg('sum')
    return [oneS,twoS,threeS,fourS,fiveS,sixS,sevenS,eightS,nineS,tenS]

如何将此函数的输出分配给数据框的列(已经存在)

我正在应用该函数的数据框如下

Cycle   Type    Time
1   1   101
1   1   102
1   1   103
1   1   104
1   1   105
1   1   106
9   1   101
9   1   102
9   1   103
9   1   104
9   1   105
9   1   106

我要添加列的数据框如下所示,并添加新列Ones,TwoS .....应该如图所示添加并用函数结果填充。

Cycle   Type    OneS    TwoS    ThreeS
1   1           
9   1           
8   1           
10  1           
3   1           
5   2           
6   2           
7   2           

如果我只为一个值编写一个函数并按如下所示应用它,则有可能:

grouped_data['fm']= data_train_bel1800.groupby(['Cycle', 'Type'])['Time'].apply( lambda x: fm(x))

但是我想一次完成所有操作,以使它整洁而清晰。

1 个答案:

答案 0 :(得分:2)

您可以使用:

def f(x):
    out = []
    for i in range(10):
        out.append(x.iloc[i*len(x)//10:(i+1)*len(x)//10].agg('sum'))
    return pd.Series(out)


df1 = (data_train_bel1800.groupby(['Cycle', 'Type'])['Time']
                         .apply(f)
                         .unstack()
                         .add_prefix('new_')
                         .reset_index())

print (df1)
   Cycle  Type  new_0  new_1  new_2  new_3  new_4  new_5  new_6  new_7  new_8  \
0      1     1      0    101    102    205    207    209    315    211    211   
1      9     1      0    101    102    205    207    209    315    211    211   

   new_9  
0    106  
1    106