【问题标题】:Grouping columns of dataframe by other dataframe and calculate weighted average of aggregated columns按其他数据框对数据框的列进行分组并计算聚合列的加权平均值
【发布时间】:2021-11-17 14:43:32
【问题描述】:

我有一个包含四个时间序列的 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')

【问题讨论】:

  • 您似乎没有指定当agroup对应多行时,每个项目将如何计算为匹配项目的行的聚合。
  • 如果一个组对应于多行,例如“Group1”,那么我会尝试根据 Dataframe 权重中特定时间的各个权重进行聚合。
  • 在您的描述中,权重与日期维度(即“日期”)相关,而不是与组行相关。您应该提供对 df2 进行的计算的详细信息。
  • 我认为这很清楚。 df2 1.85 中的第一个值计算为:1.2*0.5 + 3.5*0.25 + 1.5*0.25。第 1 组从 3 列获取数据,这些列乘以 3 个权重并相加
  • 是的,这正是我尝试的方式。我在上面添加了。

标签: python pandas dataframe aggregate weighted-average


【解决方案1】:
  1. df1weights 相乘
  2. stackmap 组的列名
  3. groupby“日期”和组(“level_1”)和sum
  4. 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

【讨论】:

  • 非常感谢您的回答。为了避免以下错误,我究竟需要更改什么:不能将序列乘以“str”类型的非整数。
  • 将 DataFrame 中的“nan”(字符串)更改为 np.nan(浮点数)。使用df1 = df1.replace("nan", np.nan)weights = weights.replace("nan", np.nan)
  • 不知道我说的对不对,我也想出了一个解决方案,你需要将Date列设置为索引,那么该特定行的Series的数字将是浮点数,如果系列包含作为第一个值的数据,则所有值都将被解释为字符串。尝试将 df 的一部分与权重的一部分相乘时,我遇到了同样的错误。
猜你喜欢
  • 2018-04-10
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2022-08-21
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多