Python Pandas:迭代行时对DataFrame值进行一些更新

时间:2017-02-09 13:41:36

标签: python pandas

我想在迭代行时更新一些列值,但是花了很长时间。我建议herehere使用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

然后,我想根据InitialTotal的值更新列AB,然后更新{{1}前一行' s Initial。 我的意思是,当前Total等于前一行Total

时,Initial会被转移到下一行code
code

代码运行了将近一个小时,但只能达到索引30000-ish。是否有其他或两种有效方法的想法或建议?

或者,我还需要考虑其他方面(删除一些列等)?

非常感谢!

1 个答案:

答案 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