使用pandas迭代减去每一行?

时间:2017-12-19 12:32:11

标签: python pandas dataframe

我有一个这样的数据框:

        abc  
9       32.242063  
3       24.419279  
8       25.464011  
6       25.029761  
10      18.851918  
2       26.027582  
1       27.885187  
4       20.141231  
5       31.179138  
7       22.893074  
11      31.640625  
0       33.150434 

我想从100减去第一行,然后从(100 - 第一行)的剩余值中减去第二行,依此类推。

我试过了:

a = 100 - df["abc"]

但每次从100减去它。

任何人都可以建议正确的方法吗?

2 个答案:

答案 0 :(得分:3)

似乎你需要:

df['new'] = 100 - df['abc'].cumsum()
print (df)
          abc         new
9   32.242063   67.757937
3   24.419279   43.338658
8   25.464011   17.874647
6   25.029761   -7.155114
10  18.851918  -26.007032
2   26.027582  -52.034614
1   27.885187  -79.919801
4   20.141231 -100.061032
5   31.179138 -131.240170
7   22.893074 -154.133244
11  31.640625 -185.773869
0   33.150434 -218.924303

答案 1 :(得分:1)

选项1
np.cumsum -

df["abc"] = 100 - np.cumsum(df.abc.values)
df
           abc
9    67.757937
3    43.338658
8    17.874647
6    -7.155114
10  -26.007032
2   -52.034614
1   -79.919801
4  -100.061032
5  -131.240170
7  -154.133244
11 -185.773869
0  -218.924303

在另一个答案中,这比pd.Series.cumsum要快。

选项2
Loopy等效,cythonized。

%load_ext Cython

%%cython
def foo(r):
    x = [100 - r[0]]
    for i in r[1:]:
        x.append(x[-1] - i)

    return x

df['abc'] = foo(df['abc'])
df

           abc
9    66.849566
3    42.430287
8    16.966276
6    -8.063485
10  -26.915403
2   -52.942985
1   -80.828172
4  -100.969403
5  -132.148541
7  -155.041615
11 -186.682240
0  -219.832674