问题:
这是我的dataframe结构:
现在我想将其转化成这样的:
下面是如何使用 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)
解释
- 创建 DataFrame: 使用提供的数据创建一个 pandas DataFrame。
- 定义加权均价计算函数:
weighted_avg函数计算每组的加权均价。 - 分组和应用函数: 使用
groupby按code和date分组,然后应用weighted_avg函数来计算加权均价。 - 转置数据: 使用
unstack将date列转为 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 的均价
其中转置数据unstack 将 date 列转为 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