Python、Pandas:使用 GroupBy.groups 描述将其应用于另一个分组

2023-12-28

让我们考虑一个 DataFrame,它在 2010 年 1 月的每一天包含 1 行 2 个值:

date_range = pd.date_range(dt(2010,1,1), dt(2010,1,31), freq='1D')
df = pd.DataFrame(data = np.random.rand(len(date_range),2), index = date_range)

我将该 DataFrame 拆分为 5 个 DataFrame 的列表,每个 DataFrame 都包含原始数据的 1 周数据:df_weeks = [g for n, g in df.groupby(pd.TimeGrouper('W'))]

如果我输入df.groupby(pd.TimeGrouper('W')).groups我可以看到一个字典解释如何分组:

{Timestamp('2010-01-03 00:00:00', freq='W-SUN'): 3,
 Timestamp('2010-01-10 00:00:00', freq='W-SUN'): 10,
 Timestamp('2010-01-17 00:00:00', freq='W-SUN'): 17,
 Timestamp('2010-01-24 00:00:00', freq='W-SUN'): 24,
 Timestamp('2010-01-31 00:00:00', freq='W-SUN'): 31}

让我们考虑另一个具有稀疏数据但与第一个重叠的 TimeSeries:

observations = pd.DataFrame(data =np.random.rand(5,2), index = (dt(2010,1,12), dt(2010,1,18), dt(2010,1,20), dt(2010,1,22), dt(2010,1,28)))

如果我运行相同的代码obs_weeks = [g for n, g in observations.groupby(pd.TimeGrouper('W'))],显然它会在列表中返回更少的 DataFrame,因为数据覆盖的范围更小。observations.groupby(pd.TimeGrouper('W')).groups返回:

{Timestamp('2010-01-17 00:00:00', freq='W-SUN'): 1,
 Timestamp('2010-01-24 00:00:00', freq='W-SUN'): 4,
 Timestamp('2010-01-31 00:00:00', freq='W-SUN'): 5}

但有没有办法重用第一个 DataFrame.GroupBy 的组将其应用到第二个?即,这意味着在特定情况下最终会出现一个变量obs_weeks包含 5 个数据帧,跨越相同的时间范围df_weeks,其中 2 个是空的?


解决您的问题的一种简单方法是确保观测数据框包含 df 数据框包含的所有日期。您可以使用reindex方法。然后您将拥有完全相同的组。您还可以使用resample('W')代替groupby(pd.Timegrouper('W'))

obs2 = observations.reindex(df.index)

obs2.resample('W').groups

{Timestamp('2010-01-03 00:00:00', freq='W-SUN'): 3,
 Timestamp('2010-01-10 00:00:00', freq='W-SUN'): 10,
 Timestamp('2010-01-17 00:00:00', freq='W-SUN'): 17,
 Timestamp('2010-01-24 00:00:00', freq='W-SUN'): 24,
 Timestamp('2010-01-31 00:00:00', freq='W-SUN'): 31}

如果我们进行简单的聚合(例如求和),我们可以看到两个帧的结果

df.resample('W').sum()

                 0         1
2010-01-03  1.990558  2.555191
2010-01-10  2.707777  3.771756
2010-01-17  2.799897  3.353363
2010-01-24  3.165479  2.778870
2010-01-31  4.946577  3.394211

现在与obs2其中有 2 个缺失组

obs2.resample('W').sum()

                   0         1
2010-01-03       NaN       NaN
2010-01-10       NaN       NaN
2010-01-17  0.172341  0.137136
2010-01-24  1.752472  2.375306
2010-01-31  0.711525  0.124271
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python、Pandas:使用 GroupBy.groups 描述将其应用于另一个分组 的相关文章

随机推荐