Python 数据帧到nxn矩阵

Python 数据帧到nxn矩阵,python,pandas,dataframe,dictionary,matrix,Python,Pandas,Dataframe,Dictionary,Matrix,我有一个非常大的数据帧,其示例如下所示: df = pd.DataFrame({'From':['a','b','c','a','d'], 'To':['b', 'c', 'a', 'd', 'e'], 'Rates':[1e-4, 2.3e-2, 1e-2, 100, 70]}) In[121]: df Out[121]: From To Rates 0 a b 0.0001 1 b c 0.0230 2 c a 0.0100 3

我有一个非常大的数据帧,其示例如下所示:

df = pd.DataFrame({'From':['a','b','c','a','d'], 'To':['b', 'c', 'a', 'd', 'e'], 'Rates':[1e-4, 2.3e-2, 1e-2, 100, 70]})

In[121]: df
Out[121]: 
  From To     Rates
0    a  b    0.0001
1    b  c    0.0230
2    c  a    0.0100
3    a  d  100.0000
4    d  e   70.0000
      a       b      c      d     e
a  0.00  0.0001  0.000  100.0   0.0
b  0.00  0.0000  0.023    0.0   0.0
c  0.01  0.0000  0.000    0.0   0.0
d  0.00  0.0000  0.000    0.0  70.0
e  0.00  0.0000  0.000    0.0   0.0
我想要的最终结果是一个n x n矩阵模型_矩阵,其中n=lendf如下所示:

df = pd.DataFrame({'From':['a','b','c','a','d'], 'To':['b', 'c', 'a', 'd', 'e'], 'Rates':[1e-4, 2.3e-2, 1e-2, 100, 70]})

In[121]: df
Out[121]: 
  From To     Rates
0    a  b    0.0001
1    b  c    0.0230
2    c  a    0.0100
3    a  d  100.0000
4    d  e   70.0000
      a       b      c      d     e
a  0.00  0.0001  0.000  100.0   0.0
b  0.00  0.0000  0.023    0.0   0.0
c  0.01  0.0000  0.000    0.0   0.0
d  0.00  0.0000  0.000    0.0  70.0
e  0.00  0.0000  0.000    0.0   0.0
下面的代码通过将df转换为dictionary transfer_rates并用dictionary中的值填充model_矩阵来工作,但是对于大型df来说,这是非常低效的

有更有效的方法吗?

您可以使用pandas.pivot:

>>>df2=df.pivotindex=From,columns=To,values=Rates >>>allopts=listabcdefgh定义所有可能的选项 >>>df3=pd.DataFrameindex=allopts,columns=allopts创建空df以覆盖空行/列 >>>df4=pd.concat[df2,df3],sort=False >>>df4.groupbydf4.index.first.fillna0 a b c d e f g h a 0.00 0.0001 0.000 100.0 0.0.0.0 0.0 b 0.00 0.0000 0.023 0.0 0.0 0.0 0.0 c 0.01 0.0000 0.000 0.0 0.0.0.0 0.0 d 0.00 0.0000 0.000 0.0 70.0 0.0 0.0 e 0.00 0.0000 0.000 0.0 0.0 0.0 0.0 f 0.00 0.0000 0.000 0.0 0.0.0.0 0.0 g 0.00 0.0000 0.000 0.0 0.0.0.0 0.0 h 0.00 0.0000 0.000 0.0 0.0.0.0 0.0 参考:

您可以使用pandas.pivot:

>>>df2=df.pivotindex=From,columns=To,values=Rates >>>allopts=listabcdefgh定义所有可能的选项 >>>df3=pd.DataFrameindex=allopts,columns=allopts创建空df以覆盖空行/列 >>>df4=pd.concat[df2,df3],sort=False >>>df4.groupbydf4.index.first.fillna0 a b c d e f g h a 0.00 0.0001 0.000 100.0 0.0.0.0 0.0 b 0.00 0.0000 0.023 0.0 0.0 0.0 0.0 c 0.01 0.0000 0.000 0.0 0.0.0.0 0.0 d 0.00 0.0000 0.000 0.0 70.0 0.0 0.0 e 0.00 0.0000 0.000 0.0 0.0 0.0 0.0 f 0.00 0.0000 0.000 0.0 0.0.0.0 0.0 g 0.00 0.0000 0.000 0.0 0.0.0.0 0.0 h 0.00 0.0000 0.000 0.0 0.0.0.0 0.0 参考:

这项工作:

In [85]: df2 = df.pivot(index="From", columns="To", values="Rates")                                                                                                                                                

In [86]: full_index = df2.index.union(df2.columns)                                                                                                                                                                 

In [87]: df2 = df2.reindex(labels=full_index, axis=0).reindex(labels=full_index, axis=1).fillna(0.0)                                                                                                               

In [88]: df2                                                                                                                                                                                                       
Out[88]: 
      a       b      c      d     e
a  0.00  0.0001  0.000  100.0   0.0
b  0.00  0.0000  0.023    0.0   0.0
c  0.01  0.0000  0.000    0.0   0.0
d  0.00  0.0000  0.000    0.0  70.0
e  0.00  0.0000  0.000    0.0   0.0

根据这个问题改编:

这项工作:

In [85]: df2 = df.pivot(index="From", columns="To", values="Rates")                                                                                                                                                

In [86]: full_index = df2.index.union(df2.columns)                                                                                                                                                                 

In [87]: df2 = df2.reindex(labels=full_index, axis=0).reindex(labels=full_index, axis=1).fillna(0.0)                                                                                                               

In [88]: df2                                                                                                                                                                                                       
Out[88]: 
      a       b      c      d     e
a  0.00  0.0001  0.000  100.0   0.0
b  0.00  0.0000  0.023    0.0   0.0
c  0.01  0.0000  0.000    0.0   0.0
d  0.00  0.0000  0.000    0.0  70.0
e  0.00  0.0000  0.000    0.0   0.0

改编自此问题:

使用设置索引、取消堆叠和对齐

使用“设置索引”、“取消堆叠”和“对齐”


这是我的解决方案,但它遗漏了e行,根据问题,e行应该用0填充。谢谢。问题是,我需要一个平方矩阵来进行进一步的操作,但这并没有给我“From”区域,其中没有对应的“To”。这是我的解决方案,但它遗漏了e行,根据问题,e行应该用0填充。谢谢。问题是,我需要一个平方矩阵来进行进一步的操作,这并没有给我“From”隔间,那里没有对应的“To”。