将置换矩阵应用于 pandas DataFrame
Apply permutation matrix to pandas DataFrame
我有两个大小相同的 DataFrame(称它们为 A
和 B
),它们具有相同的一组索引和列名称。 A
和 B
的 (row/column) 标签顺序不同,我希望它们的标签相同,这样我就可以在其他程序中直接操作矩阵。从数学上讲,有一个置换矩阵 P
可以将一个矩阵标签重新排列为另一个矩阵标签,因此我可以通过构建矩阵来应用此转换。然而,我觉得这是矫枉过正,pandas 本身应该存在一个解决方案。
有没有一种简单的方法可以做到这一点 pandas 而无需下面的丑陋技巧?
# 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)
您可以使用 reindex_like
重新排序一个 DataFrame 的 rows/columns 以符合另一个 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
我有两个大小相同的 DataFrame(称它们为 A
和 B
),它们具有相同的一组索引和列名称。 A
和 B
的 (row/column) 标签顺序不同,我希望它们的标签相同,这样我就可以在其他程序中直接操作矩阵。从数学上讲,有一个置换矩阵 P
可以将一个矩阵标签重新排列为另一个矩阵标签,因此我可以通过构建矩阵来应用此转换。然而,我觉得这是矫枉过正,pandas 本身应该存在一个解决方案。
有没有一种简单的方法可以做到这一点 pandas 而无需下面的丑陋技巧?
# 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)
您可以使用 reindex_like
重新排序一个 DataFrame 的 rows/columns 以符合另一个 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