我想在迭代行时更新一些列值,但是花了很长时间。我建议here和here使用itertuples()
代替iterrows()
,我无法使用apply
函数,因为我想要更新两列一次迭代。
我将使用一个简化的示例,因为我的案例涉及10个以上与以下代码无关的列。在这里包含它们会使代码看起来更糟。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 5, size=(90000, 4)),
columns=['Initial', 'A', 'B'])
df['code'] = list('KLMNOP' * 15000) # Adding column 'code'
df = df.sort_values('code') # Sorting the df by 'code'
df['Total'] = np.nan
然后,我想根据Initial
和Total
的值更新列A
和B
,然后更新{{1}前一行' s Initial
。
我的意思是,当前Total
等于前一行Total
Initial
会被转移到下一行code
code
代码运行了将近一个小时,但只能达到索引30000-ish。是否有其他或两种有效方法的想法或建议?
或者,我还需要考虑其他方面(删除一些列等)?
非常感谢!
答案 0 :(得分:0)
IIUC,您需要使用pandas cumsum
这就是我所假设的,对于每个代码,初始Total总是-100,&什么时候A&的价值B大于2,需要在前一行中添加一个。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 5, size=(90000, 3)),
columns=['Initial', 'A', 'B'])
df['code'] = list('KLMNOP' * 15000) # Adding column 'code'
df = df.sort_values('code') # Sorting the df by 'code'
df['new_Initial'] = np.where((df.A>2 ) & (df.B>2 ) ,1,0)
df.set_value(0, 'new_Initial', -100)
df.set_value(1, 'new_Initial', -100)
df.set_value(2, 'new_Initial', -100)
df.set_value(3, 'new_Initial', -100)
df.set_value(4, 'new_Initial', -100)
df['Total'] = df.groupby(['code']).new_Initial.cumsum()
print df
输出
Initial A B code new_Initial Total
0 1 0 2 K -100 -100
84312 4 1 2 K 0 -100
34110 1 4 0 K 0 -100
34104 2 0 4 K 0 -100
34098 0 4 3 K 1 -99
34092 4 1 0 K 0 -99
34086 2 2 4 K 0 -99
34080 1 2 2 K 0 -99
84318 4 2 2 K 0 -99
34074 2 3 2 K 0 -99
34116 2 1 1 K 0 -99
34068 4 3 0 K 0 -99
34056 4 3 4 K 1 -98
34050 2 4 1 K 0 -98
34044 1 1 0 K 0 -98
84324 1 0 2 K 0 -98
34038 0 1 0 K 0 -98
34032 1 2 0 K 0 -98
34026 0 1 1 K 0 -98
34020 0 4 4 K 1 -97
34014 0 0 4 K 0 -97
34062 4 0 3 K 0 -97
34122 2 3 3 K 1 -96
34128 1 1 1 K 0 -96
34134 3 2 3 K 0 -96
34242 0 1 3 K 0 -96
34236 4 3 2 K 0 -96
34230 4 3 1 K 0 -96
34224 4 2 0 K 0 -96
84294 2 3 2 K 0 -96
... .. .. ... ... ...
51245 4 4 0 P 0 2355
51239 3 3 1 P 0 2355
51365 0 1 2 P 0 2355
51371 1 3 4 P 1 2356
51377 4 2 3 P 0 2356
51383 0 2 2 P 0 2356
51515 0 2 1 P 0 2356
51509 4 2 2 P 0 2356
51503 3 0 0 P 0 2356
51497 1 3 0 P 0 2356
51491 4 3 2 P 0 2356
51485 3 3 2 P 0 2356
51479 4 0 3 P 0 2356
51473 2 3 3 P 1 2357
51467 3 4 3 P 1 2358
51461 4 0 2 P 0 2358
51827 4 0 2 P 0 2358
51455 1 2 1 P 0 2358
51443 3 0 4 P 0 2358
51437 0 0 4 P 0 2358
51431 2 2 2 P 0 2358
51425 3 2 1 P 0 2358
51419 2 3 2 P 0 2358
51413 2 0 2 P 0 2358
51407 0 1 3 P 0 2358
51401 4 2 2 P 0 2358
51395 2 4 4 P 1 2359
51389 1 3 3 P 1 2360
51449 3 4 0 P 0 2360
89999 0 1 4 P 0 2360