首页 > 解决方案 > 在 pandas 中,如何对字符串的第一个实例的行进行操作?

问题描述

我有一个 csv 文件,我正在尝试将具有累积值的列转换为单个值。我可以用

df['delta'] = df['expenditure'].diff()

因此,对于每个人(A,B ..),我想要他们上次参加以来支出的变化。什么给了我

person days  expenditure delta
A        1       10       
A        2       24       14
A        10      45       21
B        2        0      -45
B        7        2        2
B        8       10        8
C        5       50       40
C        6       78       28
C        7       90       12

我想要的是

person days  expenditure delta
A        1       10 --->  10
A        2       24       14
A        10      45       21
B        2        0 --->   0
B        7        2        2
B        8       10        8
C        5       50 --->  50
C        6       78       28
C        7       90       12

因此,对于每个人,我希望将他们最低一天的支出值放在增量中。

另外,如果我想按天计算平均增量,我该怎么做?那就是如果我想要

person days  expenditure delta
A        1       10       10
A        2       24       14
A        10      45       21/8
B        2        0        0
B        7        2        2/5
B        8       10        8

所以 21/8 是 A 的(支出变化)/(天数变化)

标签: pythonpython-3.xpandas

解决方案


使用DataFrameGroupBy.diffwith 将第一个缺失值替换为 original by Series.fillna

df['delta'] = df.groupby('person')['expenditure'].diff().fillna(df['expenditure'])
print (df)
  person  days  expenditure  delta
0      A     1           10   10.0
1      A     2           24   14.0
2      A    10           45   21.0
3      B     2            0    0.0
4      B     7            2    2.0
5      B     8           10    8.0
6      C     5           50   50.0
7      C     6           78   28.0
8      C     7           90   12.0

其次是可以处理两列,然后分成DataFrame.eval

df['delta'] = (df.groupby('person')[['expenditure', 'days']].diff()
                 .fillna(df[['expenditure','days']])
                 .eval('expenditure / days'))

什么工作一样:

df['delta'] = (df.groupby('person')['expenditure'].diff().fillna(df['expenditure'])
                .div(df.groupby('person')['days'].diff().fillna(df['days'])))

print (df)
  person  days  expenditure   delta
0      A     1           10  10.000
1      A     2           24  14.000
2      A    10           45   2.625
3      B     2            0   0.000
4      B     7            2   0.400
5      B     8           10   8.000
6      C     5           50  10.000
7      C     6           78  28.000
8      C     7           90  12.000

推荐阅读