df.groupby(['code', 'date']).apply(weighted_avg).unstack(fill_value=0)

87 阅读2分钟

问题: 这是我的dataframe结构: 1724809641024.png

现在我想将其转化成这样的:

1724809710898.png

下面是如何使用 pandas 来计算并展示结果的代码:

import pandas as pd

# 创建 DataFrame
data = {
    'code': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
    'date': ['2024m1', '2024m1', '2024m2', '2024m3', '2024m1', '2024m2', '2024m3', '2024m3', '2024m4', '2024m1', '2024m2', '2024m3', '2024m4', '2024m5'],
    'val': [1, 10, 2, 3, 4, 5, 6, 5, 7, 8, 9, 10, 11, 12],
    'vol': [1, 11, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12]
}

df = pd.DataFrame(data)

# 计算加权均价
def weighted_avg(group):
    total_val_vol = group['val'] .sum()
    total_vol = group['vol'].sum()
    return total_val_vol / total_vol

# 按 code 和 date 进行分组并计算加权均价
result = df.groupby(['code', 'date']).apply(weighted_avg).unstack(fill_value=0)

# 显示结果
print(result)

解释

  1. 创建 DataFrame: 使用提供的数据创建一个 pandas DataFrame。
  2. 定义加权均价计算函数: weighted_avg 函数计算每组的加权均价。
  3. 分组和应用函数: 使用 groupbycodedate 分组,然后应用 weighted_avg 函数来计算加权均价。
  4. 转置数据: 使用 unstackdate 列转为 DataFrame 的列索引,以便形成需要的表格格式。

结果

执行上述代码后,会得到如下格式的 DataFrame,其中 code 为行索引,date 为列索引,值为加权均价:

date     2024m1  2024m2  2024m3  2024m4  2024m5
code                                           
A     0.916667     1.0  1.000000     0.0     0.0
B     1.000000     1.0  0.916667     1.0     0.0
C     1.000000     1.0  1.000000     1.0     1.0

这个 DataFrame 显示了每个 code 在每个 date 的均价

其中转置数据unstackdate 列转为 DataFrame 的列索引,以便形成需要的表格格式。,如果不加unstack,那么输出结果是:

code  date  
A     2024m1    0.916667
      2024m2    1.000000
      2024m3    1.000000
B     2024m1    1.000000
      2024m2    1.000000
      2024m3    0.916667
      2024m4    1.000000
C     2024m1    1.000000
      2024m2    1.000000
      2024m3    1.000000
      2024m4    1.000000
      2024m5    1.000000
dtype: float64