Python-更新不同数组列的值(提高速度)

时间:2018-09-11 16:35:34

标签: python arrays pandas performance indexing

我正在尝试为每一行使用不同的列数组将值更新为“ True”。我有一个全部为False的数据框:

    Place1 Place2 ... PlaceN
Id1 False  False  ... False
Id2 False  False  ... False
 .
 .
 .
IdN False  False  ... False

一个包含每个ID的位置列表的系列:

Id1 [Place1, Place2]
Id2 [Place4, Place54, PlaceN]
 .
 .
 .
IdN [Place1]

我需要将DataFrame中Id1的列Place1Place2中的值更改为True

目前我有一个使用循环的有效代码

for id, row in df.iterrows():
    df.loc[id]=row[series[id]]=True

但是对于超过6万个ID和150个位置,它太慢了。我需要它在阅读新闻时而不是现在的时间里完成。

我尝试了其他方法,例如apply,但是lambda函数不允许分配。

每个行都有一系列结构良好的列,感觉应该有一种索引列数组的矢量化方法。但是我没有找到。

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用sklearn库并直接输入您的系列。这是一个演示:

from sklearn.preprocessing import MultiLabelBinarizer

s = pd.Series([['Place1', 'Place2'], ['Place1', 'Place2', 'Place3'], ['Place2']],
              index=['Id1', 'Id2', 'Id3'])

mlb = MultiLabelBinarizer()

res = pd.DataFrame(mlb.fit_transform(s),
                   columns=mlb.classes_,
                   index=s.index).astype(bool)

结果:

    Place1 Place2 Place3
Id1   True   True  False
Id2   True   True   True
Id3  False   True  False

这比通过手动迭代填充现有数据框更有效。