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

时间:2017-07-27 18:26:06

标签: pandas dataframe elementwise-operations

我有一个Pandas数据框列:

list.add(line.split('-')[1..-1].join(',').replaceAll(',','-'))

我想将它变成一个方形矩阵掩码,其索引和列与s = VALUE INDEX A 12 B 21 C 7 ... Y 21 Z 7 相同,如果s.index中列和索引的值相同,则每个元素都为True或者s否则。

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

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

这需要很长时间,并且必须明确地循环通过10K x 10K / 2 = 50M元素......不理想?

1 个答案:

答案 0 :(得分: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