这是fastest/pythonian使用groupby,apply和join的方式吗?

Is this the fastest/pythonian way to use groupby, apply and join?

我正在处理一个大型数据集。我已将此解决方案实现为玩具模型以应用于我的数据。下面的函数 "testFunction" 只是一个可以包含多个变量的通用函数的示例。

这个例子是我需要的。我的问题是这是否是实现它的最佳方式:

import pandas as pd
import numpy as np

def creatingDataFrame():

    raw_data = {'id': [1,2,3,4,5,6,7,8,9,10],
                'code': [1, 2, 3, 3 , 2, 1, 2, 1, 3, 3],                
                'var1': [10, 20, 30, 40 , 50, 10, 20, 30, 40, 50],
                'var2': [20, 30, 40 , 50, 10, 20, 30, 40, 50, 10],
                'var3': [30, 40 , 50, 10, 20, 30, 40, 50, 10, 20]}
    df = pd.DataFrame(raw_data, columns = ['id','code', 'var1', 'var2', 'var3'])
    df.loc[1, 'var1'] = np.nan
    df.loc[8,'var3']=np.nan    

    return df



def testFunction(group,variables):
    return np.mean(group[variables[0]])/np.mean(group[variables[1]])

if __name__ == '__main__':

    df=creatingDataFrame()

    grouped=df.dropna().groupby(['code'])


    data = grouped.apply(testFunction,variables=['var1','var3'])    
    dfData=pd.DataFrame(data,columns=['testFunction2Data'])
    df=df.join(dfData,on='code',rsuffix='_r')
    print df

这是原始数据框:

   id  code  var1  var2  var3
0   1     1    10    20    30
1   2     2   NaN    30    40
2   3     3    30    40    50
3   4     3    40    50    10
4   5     2    50    10    20
5   6     1    10    20    30
6   7     2    20    30    40
7   8     1    30    40    50
8   9     3    40    50   NaN
9  10     3    50    10    20

这是带有额外列的修改后的数据框:

   id  code  var1  var2  var3  testFunction2Data
0   1     1    10    20    30           0.454545
1   2     2   NaN    30    40           1.166667
2   3     3    30    40    50           1.500000
3   4     3    40    50    10           1.500000
4   5     2    50    10    20           1.166667
5   6     1    10    20    30           0.454545
6   7     2    20    30    40           1.166667
7   8     1    30    40    50           0.454545
8   9     3    40    50   NaN           1.500000
9  10     3    50    10    20           1.500000

版本:

问题:我需要将一些函数应用于大型数据集的变量组,然后我需要在原始数据框中使用这些函数的每组结果创建新列。在上面的示例中,我实现了一个解决方案,但我不确定这是否是最好的方法,因为我是 Pandas.

的新手

作为改进,您可以将 np.mean 直接传递给 DataFrameGroupBy.agg

gp = df.dropna().groupby(['code'])[['var1', 'var3']].agg(np.mean)  
# gp = df.dropna().groupby(['code'])[['var1', 'var3']].agg('mean')  

现在,将 var1 除以 var3:

gp2 = gp['var1'] / gp['var3']

将此与连接合并:

 df.join(
    pd.DataFrame(gp['var1'] / gp['var3'], columns=['testFunction2Data']), 
    on='code', 
    rsuffix='_r')

   id  code  var1  var2  var3  testFunction2Data
0   1     1  10.0    20  30.0           0.454545
1   2     2   NaN    30  40.0           1.166667
2   3     3  30.0    40  50.0           1.500000
3   4     3  40.0    50  10.0           1.500000
4   5     2  50.0    10  20.0           1.166667
5   6     1  10.0    20  30.0           0.454545
6   7     2  20.0    30  40.0           1.166667
7   8     1  30.0    40  50.0           0.454545
8   9     3  40.0    50   NaN           1.500000
9  10     3  50.0    10  20.0           1.500000