【问题标题】:Python - Updating values for different Array columns (Speed Improvement) [duplicate]Python - 更新不同数组列的值(速度改进)[重复]
【发布时间】:2019-02-16 05:29:13
【问题描述】:

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

    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

但是对于超过 60k 个 ID 和 150 个位置来说,它太慢了。我需要它在我阅读新闻文章的时候完成,而不是现在的几个小时。

我尝试过其他方法,例如 apply,但 lambda 函数不允许赋值。

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

提前感谢您的帮助!

【问题讨论】:

  • 谢谢。原来我的搜索技巧也需要打磨。感谢您的回复!

标签: python arrays pandas performance indexing


【解决方案1】:

您可以使用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

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

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 2021-12-26
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多