大数据框中的熊猫加权平均方式

时间:2020-06-28 14:15:16

标签: python pandas performance

我确实在Pandas中有一个大型数据集(大约800万行x 25列),我正在努力寻找一种方法来计算此数据帧的加权平均值,从而创建另一个数据帧。

这是我的数据集的样子(非常简化的版本):

                   prec     temp
location_id hours             
135         1      12.0      4.0
            2      14.0      4.1
            3      14.3      3.5
            4      15.0      4.5
            5      15.0      4.2
            6      15.0      4.7
            7      15.5      5.1
136         1      12.0      4.0
            2      14.0      4.1
            3      14.3      3.5
            4      15.0      4.5
            5      15.0      4.2
            6      15.0      4.7
            7      15.5      5.1
  • 我在[location_id,hours]上具有多重索引。我大约有6万个地点,每个地点有140个小时(组成800万行)。

  • 其余数据为数字(浮点型)或分类数据。我在这里只包括2列,通常大约有20列。

  • 我愿意做的是创建一个新的数据帧,该数据帧基本上是该数据帧的加权平均值。要求表明,应按指定的权重对这些location_id中的12个进行平均,以形成combined_location_id值。

  • 例如,location_id的1,3,5,7,9,11,13,15,17,19,21,23及其适当的权重(来自另一数据的单独数据帧)应从combined_location_id CL_1的数据中加权平均。

  • 要处理的数据很多,而我却找不到完全的熊猫解决方法。因此,我采用了for loop方法。这非常慢,我相信这不是正确的方法:

def __weighted(self, ds, weights):
  return np.average(ds, weights=weights)

f = {'hours': 'first', 'location_id': 'first', 
'temp': lambda x: self.__weighted(x, weights), 'prec': lambda x: self.__weighted(x, weights)}

data_frames = []
for combined_location in all_combined_locations:
   mapped_location_ids = combined_location.location_ids
   weights = combined_location.weights_of_location_ids
   data_for_this_combined_location = pd.concat(df_data.loc[df_data.index.get_level_values(0) == location_id] for location_id in mapped_location_ids)
   data_grouped_by_distance = data_for_this_combined_location.groupby("hours", as_index=False)
   data_grouped_by_distance = data_grouped_by_distance.agg(f)
   data_frames.append(data_grouped_by_distance)

df_combined_location_data = pd.concat(data_frames)
df_combined_location_data.set_index(['location_id', 'hours'], inplace=True)


  • 这在功能上运作良好,但是性能和内存消耗却非常糟糕。我的数据集耗时超过2个小时,目前尚无法接受。 for循环的存在表明可以更好地处理此问题。
  • 是否有更好/更快的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

据我所见,您可以使用mapped_location_ids减少一个for循环

data_for_this_combined_location = df_data.loc[df_data.index.get_level_values(0).isin(mapped_location_ids)]