Python 如何正确匹配稀疏数据的多索引数据帧乘法
在发布这篇文章之前,我已经搜索过了,我在其他人中找到了,但我不认为它回答了我的问题 我有一些稀疏的数据,我想用索引正确地将它们相乘,其中的数据是一个多级索引 我对不同日期的许多Python 如何正确匹配稀疏数据的多索引数据帧乘法,python,pandas,sparse-matrix,multiplication,multi-index,Python,Pandas,Sparse Matrix,Multiplication,Multi Index,在发布这篇文章之前,我已经搜索过了,我在其他人中找到了,但我不认为它回答了我的问题 我有一些稀疏的数据,我想用索引正确地将它们相乘,其中的数据是一个多级索引 我对不同日期的许多元素ids的属性s进行了观察,但数据稀疏: 这是我的第二个数组——————————————————&md
元素id
s的属性
s进行了观察,但数据稀疏:
这是我的第二个数组——————————————————&md
对于每个日期,我希望将值相乘,因此,例如,在我观察到的数据A/1/2021-01-15
(0.87)中,应乘以日期1/2021-01-15
(0.3)的权重,值为0.261
如果任一值为NaN
,则结果为NaN
,输出帧的形状将与df_观测值
数据帧相同
我尝试过使用.multiply
,但得到了错误noValueError:cannotjoin没有重叠的索引名
df\u观测值。相乘(df\u重量在日期。unstack())
此数据的预期输出
有点新手-如果有什么建议,我会很感激的,谢谢
创建数据帧的代码
df_observations=pd.DataFrame({'observed_date':['2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16'],
'element_id':[1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,2,3,4,5,6,7,3,2,3,4,5,6,7],
'factor_id':['A','A','A','A','A','A','A','B','B','B','B','B','B','B','C','C','C','A','A','A','A','A','A','F','F','B','B','B','B','B'],
'observation':[0.87,0.84,0.15,0.6,0.17,0.76,0.03,0.91,0.05,0.38,0.06,0.27,0.92,0.27,0.16,0.71,0.32,0.92,0.88,0.53,0.79,0.15,0.3,0.16,0.36,0.05,0.22,0.73,0.7,0.9]}).pivot(index=['observed_date','element_id'], columns='factor_id', values='observation')
df_weight_at_date=pd.DataFrame({'observed_date':['2021-01-15','2021-01-15','2021-01-15',
'2021-01-16','2021-01-17','2021-01-18',
'2021-01-19','2021-01-20','2021-01-18'
],
'element_id':[1,3,5,1,3,5,1,3,9],
'weight':[0.3,0.35,0.35,1,1,0.4,1,1,0.6]}).pivot(index=['element_id'], columns='observed_date', values='weight')
在更正输入帧以使索引名匹配(
observation\u date
->observated\u date
)之后,我认为这现在起作用了,而且足够简洁
df_observations.multiply(df_weight_at_date.unstack(), axis=0)
结果
在更正输入帧以使索引名称匹配(
观测日期
->观测日期
)之后,我认为这现在起作用了,而且足够简洁
df_observations.multiply(df_weight_at_date.unstack(), axis=0)
结果
您可以尝试在日期取消堆叠
df\u weight\u
:
df_observations.mul(df_weight_at_date.unstack().fillna(1)
.reindex(df_observations.index, fill_value=1),
axis=0
)
输出:
factor_id A B C F
observed_date element_id
2021-01-15 1 0.2610 0.2730 0.048 NaN
2 0.8400 0.0500 0.710 NaN
3 0.0525 0.1330 0.112 NaN
4 0.6000 0.0600 NaN NaN
5 0.0595 0.0945 NaN NaN
6 0.7600 0.9200 NaN NaN
7 0.0300 0.2700 NaN NaN
2021-01-16 2 0.9200 NaN NaN 0.36
3 0.8800 0.0500 NaN 0.16
4 0.5300 0.2200 NaN NaN
5 0.7900 0.7300 NaN NaN
6 0.1500 0.7000 NaN NaN
7 0.3000 0.9000 NaN NaN
您可以尝试在日期取消堆叠
df\u weight\u
:
df_observations.mul(df_weight_at_date.unstack().fillna(1)
.reindex(df_observations.index, fill_value=1),
axis=0
)
输出:
factor_id A B C F
observed_date element_id
2021-01-15 1 0.2610 0.2730 0.048 NaN
2 0.8400 0.0500 0.710 NaN
3 0.0525 0.1330 0.112 NaN
4 0.6000 0.0600 NaN NaN
5 0.0595 0.0945 NaN NaN
6 0.7600 0.9200 NaN NaN
7 0.0300 0.2700 NaN NaN
2021-01-16 2 0.9200 NaN NaN 0.36
3 0.8800 0.0500 NaN 0.16
4 0.5300 0.2200 NaN NaN
5 0.7900 0.7300 NaN NaN
6 0.1500 0.7000 NaN NaN
7 0.3000 0.9000 NaN NaN
这也应该起作用:
df_weight_at_date.stack().swaplevel().to_frame('A').reindex(df_observations.columns,axis=1).ffill(axis=1).mul(df_observations)
这也应该起作用:
df_weight_at_date.stack().swaplevel().to_frame('A').reindex(df_observations.columns,axis=1).ffill(axis=1).mul(df_observations)
如果您发布了预期输出,这将非常有帮助。是的,肯定-现在已经发布了,感谢您的提示。我认为您的解决方案需要将axis更改为
0
;您可以尝试:df_observations.swaplevel().rename_axis(index={“observated_date”:“observation_date”}.mul(df_weight_at_date.stack(),axis=0.sort_index(level=“observation_date”)
你可能会有一些空行需要删除谢谢-在fcat中我搞砸了,你的评论帮助我意识到:两个框架都应该有观察日期
,这样它们就可以连接起来-第二个框架错误地有观察日期
-我现在已经更正了,如果你发布了预期输出是的,当然-现在已经完成了,感谢您的推动。我认为您的解决方案需要将axis更改为0
;您可以尝试:df_observations.swaplevel().rename_axis(index={“observated_date”:“observation_date”}.mul(df_weight_at_date.stack(),axis=0.sort_index(level=“observation_date”)
你可能会有一些空行需要删除谢谢-在fcat中我搞砸了,你的评论帮助我意识到:两个帧都应该有观察日期
,这样它们就可以连接起来-第二个帧错误地有观察日期
-我现在在帖子中纠正了这一点谢谢你花时间,但我没有认为这确实产生了所需的输出-我用此数据的导出输出更新了帖子删除fill_value=1
insidereindex
Hi,当应该是'NaN's时,没有仍然为16/1生成值我认为也删除fillna(1)?感谢您抽出时间,但我认为这不会产生所需的输出-我用此数据的导出输出更新了帖子删除fill_value=1
insidereindex
Hi,没有仍然为16/1生成值,当应该是'NaN's时,我认为也删除fillna(1)?