这是使用groupby,apply和join的最快/蟒蛇方式吗?

时间:2017-08-03 01:36:31

标签: python-2.7 dataframe pandas-groupby pandas-apply pandas-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的新手。

1 个答案:

答案 0 :(得分:1)

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

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

现在,将var1除以var3

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

您可以将此与联接:

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

print(df)

   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