gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:53 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com