python - 这是使用 groupby、apply 和 join 的最快/python 方式吗?

标签 python pandas dataframe pandas-groupby

我正在处理一个大型数据集。我已将此解决方案实现为一个玩具模型,以应用于我的数据。下面的函数“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

关于python - 这是使用 groupby、apply 和 join 的最快/python 方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45473422/

相关文章:

python - 删除pandas中重复的汉字

r - 迭代创建数据框子集的函数

python - 使用 argparse 的建议

Python 无法识别多级索引

python - 如何在django中设置两个模型之间的动态映射

python - 根据 pandas 中另一个数据帧的相似值填充数据帧中的列

python - Pandas 数据框/Python : How to update dataframe cell value using for loop at each iteration in python?

python - DataFrame 最有效的方法是将小于 40% 的行值更新为 NaN?

python - 在 Docker 容器中运行 `flake8 src` 时无输出

python - 设置弹出(Python)