Python 如何使用基于对名称的系列元素填充方形对称数据框?
在下面的空数据帧中,它是一个正方形对称矩阵Python 如何使用基于对名称的系列元素填充方形对称数据框?,python,pandas,dataframe,matrix,symmetric,Python,Pandas,Dataframe,Matrix,Symmetric,在下面的空数据帧中,它是一个正方形对称矩阵 df = pd.DataFrame(np.zeros((6,6)), index=names, columns=names) df看起来像 MCD VZ JPM PG WBA NKE MCD 0.0 0.0 0.0 0.0 0.0 0.0 VZ 0.0 0.0 0.0 0.0 0.0 0.0 JPM 0.0 0.0 0.0 0.0 0.0 0.0 PG 0.0 0.0 0.0 0.
df = pd.DataFrame(np.zeros((6,6)), index=names, columns=names)
df
看起来像
MCD VZ JPM PG WBA NKE
MCD 0.0 0.0 0.0 0.0 0.0 0.0
VZ 0.0 0.0 0.0 0.0 0.0 0.0
JPM 0.0 0.0 0.0 0.0 0.0 0.0
PG 0.0 0.0 0.0 0.0 0.0 0.0
WBA 0.0 0.0 0.0 0.0 0.0 0.0
NKE 0.0 0.0 0.0 0.0 0.0 0.0
如何根据('MCD','VZ')
等配对名称从不同数据帧的最后一列(如下所示)接收相应元素,以及如何将(i,j)
的值与(j,i)
的值相同(因为矩阵对称)?例如,0.263357
应该出现在df
中的两个位置('MCD','VZ')
和('VZ','MCD')
。一个只有3个名字的玩具答案就可以了
或者,根据所描述的
(i,j)
规则,是否有一种通用的算法通过为循环填充方形对称矩阵?您可以透视并向df添加值+转置值(.T
)
假设df2
具有作为图片发布的数据帧结构(以下值为随机值):
输出:
JPM MCD NKE PG VZ WBA
JPM 0.000000 0.532617 0.322079 0.377284 0.242471 0.020071
MCD 0.532617 0.000000 0.504874 1.494942 0.737827 0.036683
NKE 0.322079 0.504874 0.000000 0.726165 0.255161 0.645917
PG 0.377284 1.494942 0.726165 0.000000 0.654995 0.593592
VZ 0.242471 0.737827 0.255161 0.654995 0.000000 0.107172
WBA 0.020071 0.036683 0.645917 0.593592 0.107172 0.000000
回答得很好。最终的结果正是我想要的。但是看着z
本身,它出乎意料地乱成一团,不知道我在看什么,也不知道它的转置(也是随机乱成一团)如何帮助创建最终结果如果df2
从第二张图中显示的内容更改为有两个索引(前两列):df2.set\u index(['asset1','asset2'],inplace=True)
,我如何使z=df2.pivot('asset1','asset2','mi')
再次工作?z
基本上只是df2
的透视版本(与Excel中的透视表相同),当我们将它添加到df
时,值按索引和列对齐,因此我们得到了与df
中相同的索引和列顺序,关于你的set_index
问题,我认为最简单的方法是在透视
之前重置索引,即df2.reset_index().pivot('asset1','asset2','mi')
现在,这就是我所做的,因为在df2
中放置了两个索引,但是,reset\u index
行必须重复两次,因为有两个索引。有没有办法同时重置两个索引?
JPM MCD NKE PG VZ WBA
JPM 0.000000 0.532617 0.322079 0.377284 0.242471 0.020071
MCD 0.532617 0.000000 0.504874 1.494942 0.737827 0.036683
NKE 0.322079 0.504874 0.000000 0.726165 0.255161 0.645917
PG 0.377284 1.494942 0.726165 0.000000 0.654995 0.593592
VZ 0.242471 0.737827 0.255161 0.654995 0.000000 0.107172
WBA 0.020071 0.036683 0.645917 0.593592 0.107172 0.000000