我有一个包含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
逐列应用操作:
在第二列上应用后,第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
答案 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]