满足条件时停止申请

时间:2018-05-15 20:21:12

标签: python python-3.x pandas dataframe

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

我已经使用过几次检查,但由于存在大量数据,因此存在性能问题。此外,还有其他选择吗?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。

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

输出: 如果执行了列式操作:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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]