按其他数据框对数据框的列进行分组并计算聚合列的加权平均值
Grouping columns of dataframe by other dataframe and calculate weighted average of aggregated columns
我有一个包含四个时间序列的 DataFrame df1
。我想根据 DataFrame groups
将这些时间序列聚合起来,该数据帧将各个时间序列分为两组。此外,我有一个 DataFrame weights
,它定义了组内时间序列的权重因子(随时间变化)。
我试图得到的是一个 DataFrame df2
,它具有基于组聚合的时间序列并用加权因子加权。
这将是一个简单的例子:
import pandas as pd
df1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[1.2, 2.3, 0.3, 0.5],
'02K W':[3.5, 0.1, 'nan', 'nan'],
'03K W':[4.2, 5.2, 2.5, 3.0],
'04K W':[1.5, 2.6, 8.2, 4.2]})
groups = pd.DataFrame({
'ID':['01K W', '02K W', '03K W', '04K W'],
'Group':['Group1', 'Group1', 'Group2', 'Group1']})
weights = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[0.5, 0.5, 0.25, 0.5],
'02K W':[0.25, 0.25, 'nan', 'nan'],
'03K W':[1, 1, 1, 1],
'04K W':[0.25, 0.25, 0.75, 0.5]})
df2 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'Group1':[1.85, 1.82, 6.23, 2.35],
'Group2':[4.2, 5.2, 2.5, 3.0]})
df2
中的第一个元素(=1.85)计算为:
1.2x0.5 + 3.5x0.25 + 1.5x0.25
组 1 的值:1.2、3.5 和 1.5 ('2021-01-01')
第 1 组的权重因子:0.5、0.25 和 0.25('2021-01-01')
df1
乘以weights
stack
和 map
组的列名
groupby
“日期”和组 ("level_1") 和 sum
unstack
并格式化为所需的输出
output = df1.set_index("Date").mul(weights.set_index("Date")).stack().reset_index(1)
output = (output.groupby([output.index,
output["level_1"].map(dict(zip(groups["ID"],groups["Group"])))])
.sum()
.unstack()
.droplevel(0,1)
.rename_axis(None, axis=1)
)
>>> output
Group1 Group2
Date
2021-01-01 1.850 4.2
2021-01-02 1.825 5.2
2021-01-03 6.225 2.5
2021-01-04 2.350 3.0
我有一个包含四个时间序列的 DataFrame df1
。我想根据 DataFrame groups
将这些时间序列聚合起来,该数据帧将各个时间序列分为两组。此外,我有一个 DataFrame weights
,它定义了组内时间序列的权重因子(随时间变化)。
我试图得到的是一个 DataFrame df2
,它具有基于组聚合的时间序列并用加权因子加权。
这将是一个简单的例子:
import pandas as pd
df1 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[1.2, 2.3, 0.3, 0.5],
'02K W':[3.5, 0.1, 'nan', 'nan'],
'03K W':[4.2, 5.2, 2.5, 3.0],
'04K W':[1.5, 2.6, 8.2, 4.2]})
groups = pd.DataFrame({
'ID':['01K W', '02K W', '03K W', '04K W'],
'Group':['Group1', 'Group1', 'Group2', 'Group1']})
weights = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'01K W':[0.5, 0.5, 0.25, 0.5],
'02K W':[0.25, 0.25, 'nan', 'nan'],
'03K W':[1, 1, 1, 1],
'04K W':[0.25, 0.25, 0.75, 0.5]})
df2 = pd.DataFrame({
'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'],
'Group1':[1.85, 1.82, 6.23, 2.35],
'Group2':[4.2, 5.2, 2.5, 3.0]})
df2
中的第一个元素(=1.85)计算为:
1.2x0.5 + 3.5x0.25 + 1.5x0.25
组 1 的值:1.2、3.5 和 1.5 ('2021-01-01')
第 1 组的权重因子:0.5、0.25 和 0.25('2021-01-01')
df1
乘以weights
stack
和map
组的列名groupby
“日期”和组 ("level_1") 和sum
unstack
并格式化为所需的输出
output = df1.set_index("Date").mul(weights.set_index("Date")).stack().reset_index(1)
output = (output.groupby([output.index,
output["level_1"].map(dict(zip(groups["ID"],groups["Group"])))])
.sum()
.unstack()
.droplevel(0,1)
.rename_axis(None, axis=1)
)
>>> output
Group1 Group2
Date
2021-01-01 1.850 4.2
2021-01-02 1.825 5.2
2021-01-03 6.225 2.5
2021-01-04 2.350 3.0