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”。