我正在使用大型数据集。我已将此解决方案作为玩具模型实施,以应用于我的数据。下面的函数“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的新手。
答案 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