【问题标题】:How to Vectorise index insertion in Python?如何在 Python 中向量化索引插入?
【发布时间】:2021-01-19 22:14:45
【问题描述】:

我有一个非常大的数据集的问题,我可以在不到一分钟的时间内在 Excel 中完成,但在 Python 上花费的时间太长了。

目标:根据数据集 X 列和 Y 列中的信息为每一行赋予一个 ID。

在 Excel 中:

  • 将计数器初始化为 1
  • 对于每一行 i:
    • 如果 X = 0 和 Y = 0,则行 ID = 计数器,后跟计数器 += 1
    • [已编辑] 其他行 ID = 上一行中的 ID。
  • 接下来我

我的 pd 数据框很大。在 for 循环中执行此操作需要一个多小时。我不知道如何向量化我的问题以避免 for 循环。

希望有人可以帮助我。

【问题讨论】:

  • 你能告诉我们你到目前为止尝试过的代码吗?

标签: python-3.x pandas vectorization


【解决方案1】:

要找到有效的 Pandas 解决方案,您应该重新表述您的问题。您的计数器本质上是之前全零行的数量(加 1):

df = pd.DataFrame({'X': [0,2,1,0,0,1,2,0], 
                   'Y': [0,2,1,3,0,0,1,2]})
df['counter'] = (((df.X==0) & (df.Y==0)).cumsum().shift() + 1)\
                  .fillna(1).astype(int)
#   X  Y  counter
#0  0  0        1
#1  2  2        2
#2  1  1        2
#3  0  3        2
#4  0  0        2
#5  1  0        3
#6  2  1        3
#7  0  2        3

【讨论】:

  • 非常感谢。给定您的数据集,我正在寻找 [1,1,1,1,2,2,2,2] 的计数器向量。您对使用 .cumsum() 的建议非常有效。非常感谢。
  • 根据您的规则,计数器必须在 两个零的行之后递增。
  • 将计数器分配给行 ID 后发生计数器增量。
  • 没错。最初,计数器为 1。它被分配给第一个匹配的行 #0。然后它增加并变为 2。第 1、2、3、4 行用计数器的新值标记。你就是这么形容的。
  • 哦……我的错。道歉。我写错了伪代码。我在 Excel 中所做的是“Else Row ID (i) = Row ID (i - 1)”。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 2012-12-02
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多