gpt4 book ai didi

python - 将 pd.Series 向量与多索引 pd.Dataframe 相乘

转载 作者:行者123 更新时间:2023-11-28 18:57:41 26 4
gpt4 key购买 nike

我有一个 Pandas 系列和一个 Pandas 多索引数据框。

下面是一个简单的例子:

iterables = [['milk', 'honey', 'dates'], ['jan', 'feb', 'mar', 'apr']]
i = pd.MultiIndex.from_product(iterables, names=['good', 'month'])
xf = pd.DataFrame(index = i)
xf['price'] = np.random.randint(1, 25, xf.shape[0])

allocation_vector = pd.Series([0.3, 0.6, 0.1], index = ['milk', 'honey', 'dates'])

此数据框表示“从 1 月到 4 月每个月三种产品的价格”,allocation_vector 表示价格的一些小数部分。

我想要实现的是将分配向量乘以我的数据帧,得到一个序列,其索引为“jan”、“feb”、“mar”、“apr”,其值等于该月的点积(即:jan_date_price*date_pct + jan_milk_price*milk_pct + jan_honey_price*jan_pct 分别为一月、二月、三月、四月)

我只能使用讨厌的迭代 hacky 解决方案来解决这个问题。我认为必须有更多的 pythonic 方法来执行此操作,并且我不必担心向量列在与数据框列等相乘时的顺序错误。当然,实际的数据框有更多的列'参与计算。

最佳答案

我相信您需要乘以一级 Series.mul然后对每个第一级求和:

np.random.seed(2019)

iterables = [['milk', 'honey', 'dates'], ['jan', 'feb', 'mar', 'apr']]
i = pd.MultiIndex.from_product(iterables, names=['good', 'month'])
xf = pd.DataFrame(index = i)
xf['price'] = np.random.randint(1, 25, xf.shape[0])
print (xf)
price
good month
milk jan 9
feb 19
mar 6
apr 23
honey jan 16
feb 13
mar 11
apr 17
dates jan 17
feb 8
mar 6
apr 20

allocation_vector = pd.Series([0.3, 0.6, 0.1], index = ['milk', 'honey', 'dates'])

print (17*0.1+9*0.3+16*0.6)
14.0

s = xf['price'].mul(allocation_vector, level=0).sum(level=1)
print (s)
month
jan 14.0
feb 14.3
mar 9.0
apr 19.1
dtype: float64

或通过 Series.unstack reshape , 转置和使用 DataFrame.dot ,但输出值的顺序发生了变化:

s = xf['price'].unstack().T.dot(allocation_vector)
print (s)
month
apr 19.1
feb 14.3
jan 14.0
mar 9.0
dtype: float64

关于python - 将 pd.Series 向量与多索引 pd.Dataframe 相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56322440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com