numpy 通过“groupby”而不是for循环来矢量化操作,以使代码运行得更快?

mzmfm0qo  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(97)

对于使用pandas、dataframe等相对较新。
我试图让我们的代码(在完全扩展的情况下)运行得更快更有效。我在一个特定的列上使用.groupby()来获得几十万个组,然后我想对每个组执行一些简单的数学+列加法操作,如下所示。这给了我一个数据列表,每个组都有一个项目。
在此之前,我设法使一切工作相对较快,但在这一点上,这个定义需要非常长的时间。我一直听说向量化而不是for循环,但我找不到一个直接的例子来帮助我解决如何将我的定义更改为基于向量化。
这就是def:

def add_data_df(df1,df2):
  df1_group = df1.copy().groupby('ORG_INDEX', sort=False)
  sums=[]
  min_gfa=[]
  max_gfa=[]
  min_uni=[]
  max_uni=[]
  for group in df1_group:
    groupdf = group[1]
    sum_a = np.sum(groupdf['F_AREA'])
    sums.append(sum_a)

    groupdf['MINGFA'] = (groupdf['MIN_FLR'] * groupdf['F_AREA']) + (groupdf['MIN_FLR2'] * groupdf['F_AREA2'])
    groupdf['MAXGFA'] = (groupdf['MAX_FLR'] * groupdf['F_AREA']) + (groupdf['MAX_FLR2'] * groupdf['F_AREA2'])
    groupdf['MINUNITS'] = (groupdf['MIN_FLR'] * groupdf['UNITS_F']) + (groupdf['MIN_FLR2'] * groupdf['UNITS_F2'])
    groupdf['MAXUNITS'] = (groupdf['MAX_FLR'] * groupdf['UNITS_F']) + (groupdf['MAX_FLR2'] * groupdf['UNITS_F2'])

    min_gfa.append(np.sum(groupdf['MINGFA']))
    max_gfa.append(np.sum(groupdf['MAXGFA']))
    min_uni.append(np.sum(groupdf['MINUNITS']))
    max_uni.append(np.sum(groupdf['MAXUNITS']))

  df2['SUM_AREA']=sums
  df2['MIN_GFA']=min_gfa
  df2['MAX_GFA']=max_gfa
  df2['MIN_UNITS']=min_uni
  df2['MAX_UNITS']=max_uni

字符串
谢谢你!列弗

v440hwme

v440hwme1#

我想这就是你要找的

df2 = df.copy()
df2['MINGFA'] = (df2['MIN_FLR'] * df2['F_AREA']) + (df2['MIN_FLR2'] * df2['F_AREA2'])
df2['MAXGFA'] = (df2['MAX_FLR'] * df2['F_AREA']) + (df2['MAX_FLR2'] * df2['F_AREA2'])
df2['MINUNITS'] = (df2['MIN_FLR'] * df2['UNITS_F']) + (df2['MIN_FLR2'] * df2['UNITS_F2'])
df2['MAXUNITS'] = (df2['MAX_FLR'] * df2['UNITS_F']) + (df2['MAX_FLR2'] * df2['UNITS_F2'])

df2 \
    .groupby('ORG_INDEX', as_index=False, sort=False) \
    .sum() \
    [['ORG_INDEX', 'F_AREA', 'MINGFA', 'MAXGFA', 'MINUNITS', 'MAXUNITS']] \
    .rename({'F_AREA': 'SUMS'}, axis=1)

字符串
说明:
1.下面代码中的计算是针对每个组执行的,但它们只是元素级乘法和求和。这意味着您可以对整个数据框架执行这些操作一次,并且不会有任何改变。

groupdf['MINGFA'] = (groupdf['MIN_FLR'] * groupdf['F_AREA']) + (groupdf['MIN_FLR2'] * groupdf['F_AREA2'])
groupdf['MAXGFA'] = (groupdf['MAX_FLR'] * groupdf['F_AREA']) + (groupdf['MAX_FLR2'] * groupdf['F_AREA2'])
groupdf['MINUNITS'] = (groupdf['MIN_FLR'] * groupdf['UNITS_F']) + (groupdf['MIN_FLR2'] * groupdf['UNITS_F2'])
groupdf['MAXUNITS'] = (groupdf['MAX_FLR'] * groupdf['UNITS_F']) + (groupdf['MAX_FLR2'] * groupdf['UNITS_F2'])


1.所有其他计算都是每组中所有值的总和。这可以通过将数据框分组并对每个组执行求和来实现。
1.根据需要筛选和重命名列。
P.S.我复制了第一行的初始 Dataframe ,因为看起来你需要一个新的 Dataframe 。但您也可以在初始数据框上执行所有计算以避免复制。

相关问题