基于以索引和列值作为输入的函数设置 Pandas Dataframe 元素的最快方法

Fastest way to set elements of Pandas Dataframe based on a function with index and column value as input

我只有一列 Pandas 数据框:

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

我想把它变成一个与s.index具有相同索引和列的方阵掩码,如果列和索引的值在[=中相同,则每个元素要么是True 15=] 或 False 否则。

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+ 行。生成 mask DataFrame 的最快方法是什么?

我尝试过的一种方法是创建一个具有两个 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])),然后将该系列附加到 maskmask逐行迭代构建。

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

使用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