我有两个大小相同的DataFrame(称为A
和B
),它们具有相同的索引和列名称集。 A
和B
对其(行/列)标签有不同的排序,我希望它们具有相同的标签,以便我可以直接操作其他程序中的矩阵。在数学上,有一个排列矩阵P
将一个矩阵标签重新排列到另一个矩阵标签,因此我可以通过构造矩阵来应用这种变换。然而,我觉得这有点矫枉过正,大熊猫本身就应该有解决方案。
有没有一种简单的方法来做这个熊猫没有下面的丑陋黑客?
# construct A,B ...
import numpy as np
import pandas as pd
# Construct the permutation matrix
permutation = [np.where(B.index==a_idx)[0][0] for a_idx in A.index]
P = np.zeros(A.shape)
for k,row in zip(permutation,P): row[k] = 1
B2 = (P).dot(B.values).dot(P.T)
B2 = pd.DataFrame(B2, index = A.index, columns = A.index)
答案 0 :(得分:1)
您可以使用reindex_like
重新排序一个DataFrame的行/列以符合另一个DataFrame。
>>> vals = np.arange(9).reshape(3,3)
>>> df1 = pd.DataFrame(vals, columns=list('def'), index=list('abc'))
>>> df2 = pd.DataFrame(vals, columns=list('efd'), index=list('bac'))
然后重新排序df1
,使其与df2
相同:
>>> df1.reindex_like(df2)
e f d
b 4 5 3
a 1 2 0
c 7 8 6