4

我有一个单列 Pandas 数据框:

s = 
      VALUE
INDEX
A     12
B     21
C     7
...
Y     21
Z     7

我想把它变成一个具有相同索引和列的方阵掩码,如果列和索引的值相同,则每个s.index元素都相同。TruesFalse

mask = 
      A     B     C ...      Y     Z 
A  True False False ...  False False
B False  True False ...   True False
C False False  True ...  False  True
...
Y False  True False ...   True False
Z False False  True ...  False  True

我的实际s有 10K+ 行。生成该maskDataFrame 的最快方法是什么?

我尝试过的一种方法是创建一个带有两个for循环的 2 级字典。(例如dict['A']['B'] = dict['B']['A'] = True if s.loc['A'] == s.loc['B'] else False,等)。然后将底层转换dict为 Pandas 系列(例如row = pd.Series(dict[A])),然后将该系列附加到mask. mask逐行迭代构造。

这需要很长时间,并且必须显式循环遍历 10K x 10K / 2 = 50M 元素……不理想?

4

1 回答 1

3

使用numpy广播

v = s.VALUE.values
pd.DataFrame(v == v[:, None], s.index, s.index)

INDEX      A      B      C      Y      Z
INDEX                                   
A       True  False  False  False  False
B      False   True  False   True  False
C      False  False   True  False   True
Y      False   True  False   True  False
Z      False  False   True  False   True
于 2017-07-27T18:32:21.217 回答