如何从熊猫的累积总和中找回实际价值

时间:2014-12-20 16:02:47

标签: python sorting pandas

假设,我是一个DataFrame df。

>>> DATA = {'id':[1,2,3,4,5], 'salary':[1200,2300,2400,3620,2100] } 
>>> df = DataFrame(DATA)
>>> df
   id  salary
0   1    1200
1   2    2300
2   3    2400
3   4    3620
4   5    2100

从这个DataFrame df中,我可以得到一个新的DataFrame df1,累积工资总和

>>> df['salary'] = df['salary'].cumsum() 
>>> df
   id  salary
0   1    1200
1   2    3500
2   3    5900
3   4    9520
4   5   11620

这是非常常见的情况。

现在,如果给我df1并且我必须找到df。

   id  salary            id  salary
0   1    1200             0   1    1200
1   2    3500             1   2    2300
2   3    5900     ==>     2   3    2400
3   4    9520             3   4    3620
4   5   11620             4   5    2100

我必须从累积金额中找到所有身份证的实际工资。

2 个答案:

答案 0 :(得分:2)

>>> df
   id  salary
0   1    1200
1   2    3500
2   3    5900
3   4    9520
4   5   11620
>>> df['salary'] = df['salary'].diff().fillna(df['salary'].iloc[0])
>>> df
   id  salary
0   1    1200
1   2    2300
2   3    2400
3   4    3620
4   5    2100

尽管.fillna在这里效率不高,因为它只是第一个出现null的值。所以,您只需要将第一个值替换为.iloc[0]处的累积值。

答案 1 :(得分:0)

如果系列/列包含NaN,那么您需要更加小心。

In [11]: df.loc[2, 'salary'] = np.nan

In [12]: df
Out[12]:
   id  salary
0   1    1200
1   2    2300
2   3     NaN
3   4    3620
4   5    2100

In [13]: df['salary'].cumsum()
Out[13]:
0    1200
1    3500
2     NaN
3    7120
4    9220
Name: salary, dtype: float64

In [14]: df['salary'] = df['salary'].cumsum()

我们实际上可以回到原版,因为NaN被跳过了,我们只是跳过它们:

In [21]: s
Out[21]:
0    1200
1    3500
3    7120
4    9220
Name: salary, dtype: float64

In [22]: d = s.diff()

In [23]: d.iloc[0] = s.iloc[0]

In [24]: d
Out[24]:
0    1200
1    2300
3    3620
4    2100
Name: salary, dtype: float64

现在我们可以将它分配回薪水栏(缺失值变为NaN):

In [25]: df['salary'] = d

In [26]: df
Out[26]:
   id  salary
0   1    1200
1   2    2300
2   3     NaN
3   4    3620
4   5    2100

注意:如果索引不是唯一的,这将不起作用,但你可以用以下方法欺骗它:

df.loc[df['salary'].notnull(), "salary"] = s  # or s.values
相关问题