假设,我是一个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
我必须从累积金额中找到所有身份证的实际工资。
答案 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