【问题标题】:Stop apply when condition is met满足条件时停止申请
【发布时间】:2018-05-18 02:47:58
【问题描述】:

我有一个包含 1000 列和 3000 万行样本的 pandas DataFrame。我需要在每一列上执行一些操作(比如说加法、乘法等)。如果操作后任何列中的某个值更改为 0,那么我需要停止对剩余的列和行进一步应用操作。另外,我想知道它在哪一列和哪一行变成了0。

我使用了带有一些检查的 iterrows,但是由于数据很多,所以存在性能问题。另外,是否有任何替代方案可以申请,iterrows?

ID   PID     PC   TID
10   1005   8017  3
11   10335  5019  2
12   1000   8017  1
13   243    8870  1
14   4918   8305  3
15   9017   8305  3

按列应用操作:

  • Col1 减 9。
  • Col2 减 1000。
  • Col3 除以 100。
  • Col4 减 1。

在第二列上应用后,第三个值为0,然后整个过程应该停止并返回第二列第三行。

输出: 如果执行按列操作:

ID   PID    PC     TID
1    5      8017   3
2    9335   5019   2
3    0      8017   1
4    243    8870   1
5    4918   8305   3
6    9017   8305   3

如果执行逐行操作:

ID   PID    PC      TID
1    5      80.17   2
2    9335   50.19   1
3    0      8017    1
13   243    8870    1
14   4918   8305    3
15   9017   8305    3

【问题讨论】:

  • 当然。我将编辑问题。
  • 还有其他操作,比如字符串替换。空字符串和浮点、日期值。这些检查也会因列的数据类型而异。
  • 我现在已经编辑了这个问题。 @chrisz
  • @anishtain4 考虑到运行时间,我看到itertuplesapply 操作有更多的运行时间,并且比iterrows 更好。如果满足任何(行)== 0 条件,我可以很容易地用 iterrows 做到这一点。但是,我的观点是如何优化运行时间。
  • @YOLO 当然,我会对问题本身进行编辑。

标签: python python-3.x pandas dataframe


【解决方案1】:

考虑到行数多于列数,以及矢量化操作的速度要快得多,我建议如下:

for c in df.columns:
    res = <apply function on df[c]>
    if (res != 0).all(): # No zero found
        df[c] = res
        continue
    # Zero found - apply only up to it.
    df[c] = res[(res != 0).astype(int).cumsum() == 0] # Apply up to first 0
    break

【讨论】:

  • 您的解决方案看起来很有趣。但是,考虑到我的数据大约有 3000 万行,在对 df[c] 执行应用功能时,我们可以打破这个循环吗?
【解决方案2】:

这是我在评论中提到的解决方案

df1=df.copy()
df['PID']-=1000;df['PC']/=9;df['TID']-=1;df['ID']-=9

s=df.eq(0).idxmax(axis=0)
s
Out[492]:
ID     0
PID    2
PC     0
TID    2
dtype: int64

for x ,i in s.iteritems():
    df.loc[i:,x]=df1.loc[i:,x]

【讨论】:

  • 我认为在这种情况下,我们将对所有列应用操作,即使我遇到零,在 df['PID'] -1000 在第三行给出 0 之后。我的问题是当某些元素变为 0 时,我需要停止操作。我不想对剩余的行/列执行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2016-04-12
  • 2020-01-11
  • 2022-06-17
  • 1970-01-01
  • 2019-01-29
  • 2013-11-22
相关资源
最近更新 更多