首页 > 解决方案 > Python DataFrame:使用映射分解一列

问题描述

我正在尝试汇总时间序列并将其分解为其组成部分。例如,我有一个时间序列预测,我想在 3 个桶(红色、蓝色、oj)之间分解

import pandas as pd
import datetime as dt

index = pd.date_range(start = dt.date.today(), end = dt.date.today() + dt.timedelta(days = 400), freq = 'M')

df = pd.DataFrame(index = index)
df['Volume'] = [random.randint(340,950) for x in range(len(df))]
df

volume_breakdown = pd.Series({
    "red":.5,
    "blue":.3,
    "oj":.2
})
volume_breakdown

试图乘法:

df * volume_breakdown

在此处输入图像描述

我知道这与索引有关,但是有没有办法在不使用 for 循环和进行 concat/join/merge 的情况下做到这一点?

编辑:用下面的答案解决,

pd.DataFrame(
    df["Volume"].values.reshape((-1, 1)) * volume_breakdown.values, index = index, columns = volume_breakdown.index
)

标签: pythonpandasdataframejoin

解决方案


用于numpy避免索引问题:

df[volume_breakdown.index] = df["Volume"].values.reshape((-1, 1)) \
                                 * volume_breakdown.values
>>> df
            Volume    red   blue     oj
2021-05-31     722  361.0  216.6  144.4
2021-06-30     530  265.0  159.0  106.0
2021-07-31     762  381.0  228.6  152.4
2021-08-31     706  353.0  211.8  141.2
2021-09-30     811  405.5  243.3  162.2
2021-10-31     908  454.0  272.4  181.6
2021-11-30     912  456.0  273.6  182.4
2021-12-31     740  370.0  222.0  148.0
2022-01-31     692  346.0  207.6  138.4
2022-02-28     798  399.0  239.4  159.6
2022-03-31     497  248.5  149.1   99.4
2022-04-30     622  311.0  186.6  124.4
2022-05-31     589  294.5  176.7  117.8

推荐阅读