我怎样才能从Pandas的累计和中得到真正的价值呢

2024-10-01 00:22:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设,我有一个数据帧数据框。在

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

从这个数据帧df中,我可以得到一个新的数据帧df1,其中包含工资的累计和

^{pr2}$

这是非常常见的情况。在

现在,如果我得到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

我只需要从累计金额中找出所有id的实际工资。在


Tags: 数据iddataframedfdata情况金额df1
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]处的累积值。在

如果序列/列包含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的被跳过了,所以我们跳过它们:

^{pr2}$

现在我们只需将其分配回salary列(缺少的值变为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

相关问题 更多 >