Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确匹配稀疏数据的多索引数据帧乘法_Python_Pandas_Sparse Matrix_Multiplication_Multi Index - Fatal编程技术网

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
,但得到了错误no
ValueError: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
inside
reindex
Hi,当应该是'NaN's时,没有仍然为16/1生成值我认为也删除fillna(1)?感谢您抽出时间,但我认为这不会产生所需的输出-我用此数据的导出输出更新了帖子删除
fill_value=1
inside
reindex
Hi,没有仍然为16/1生成值,当应该是'NaN's时,我认为也删除fillna(1)?