我正在尝试为每一行使用不同的列数组将值更新为“ 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的列Place1
和Place2
中的值更改为True
。
目前我有一个使用循环的有效代码
for id, row in df.iterrows():
df.loc[id]=row[series[id]]=True
但是对于超过6万个ID和150个位置,它太慢了。我需要它在阅读新闻时而不是现在的时间里完成。
我尝试了其他方法,例如apply
,但是lambda函数不允许分配。
每个行都有一系列结构良好的列,感觉应该有一种索引列数组的矢量化方法。但是我没有找到。
预先感谢您的帮助!
答案 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
这比通过手动迭代填充现有数据框更有效。