python - 在 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 的(支出变化)/(天数变化)
解决方案
使用DataFrameGroupBy.diff
with 将第一个缺失值替换为 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
推荐阅读
- snowflake-cloud-data-platform - SQL 编译错误:Snowflake 表中 TIMESTAMP_NTZ(9) 字段的标识符无效
- c# - C# MongoDb:在字段上插入匹配
- php - 需要帮助配置 WAMP (phpMyAdmin)
- c++ - 类中的比较函数 [错误 2878]:二进制“<”:未找到采用左手操作数类型的运算符
- php - 使用 PHP 和 PDO 将返回的数据分配给函数的变量
- wordpress - wp_mail,发送带有多个字段的图像附件上传单个图像
- php - Laravel 6 - 在 database.php 中配置的第二个数据库,但仍然收到数据库连接 [] 未配置
- javascript - 动态 ejs 布局
- excel - 具有两列 + 最大第三列的数据透视表
- java - org.apache.poi.xslf.usermodel 发送图片后面的文字