将置换矩阵应用于pandas DataFrame

时间:2015-02-23 16:22:37

标签: python pandas dataframe permutation

我有两个大小相同的DataFrame(称为AB),它们具有相同的索引和列名称集。 AB对其(行/列)标签有不同的排序,我希望它们具有相同的标签,以便我可以直接操作其他程序中的矩阵。在数学上,有一个排列矩阵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)

1 个答案:

答案 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