我确实在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)
答案 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)]