python - Groupby ID,按时间排序,最后除以第一个
问题描述
我有以下数据框:
ID ..... Quantity Time
54 100 2020-01-01 00:00:04
55 100 2020-01-01 00:00:04
54 88 2020-01-01-00:00:05
54 66 2020-01-01 00:00:06
55 100 2020-01-01 00:00:07
55 88 2020-01-01 00:00:07
我想按 ID 对数据框(按时间排序!)进行分组,然后将最后一行的数量除以每个 ID 的第一行。
结果应如下所示:
ID ..... Quantity Time Result
54 100 2020-01-01 00:00:04
54 88 2020-01-01-00:00:05
54 66 2020-01-01 00:00:06 0.66
55 100 2020-01-01 00:00:04
55 100 2020-01-01 00:00:07
55 88 2020-01-01 00:00:07 0.88
到目前为止,我使用以下代码获取每个 ID 的第一行和最后一行。
g = df.sort_values(by=['Time']).groupby('ID')
df_new=(pd.concat([g.head(1), g.tail(1)])
.sort_values(by='ID')
.reset_index(drop=True))
然后我使用以下代码来获取除法的结果:
df_new['Result'] = df_new['Quantity'].iloc[1::2].div(df_new['Quantity'].shift())
问题是:数据框没有按时间排序。非常重要的是,我将(按时间)每个 ID 的最后一个数量除以每个 ID 的第一个数量(按时间)。
感谢您提供我需要更改代码的任何提示!
解决方案
没有对ID
值,而是三元组,因此如果需要,首先将列转换为日期时间to_datetime
,然后按每 2 列排序DataFrame.sort_values
,最后使用上一个答案的第二个或第三个解决方案:
df['Time'] = pd.to_datetime(df['Time'])
df = df.sort_values(['ID','Time'])
first = df.groupby('ID')['Quantity'].transform('first')
df['Result'] = df.drop_duplicates('ID', keep='last')['Quantity'].div(first)
print (df)
ID Quantity Time Result
0 54 100 2020-01-01 00:00:04 NaN
2 54 88 2020-01-01 00:00:05 NaN
3 54 66 2020-01-01 00:00:06 0.66
1 55 100 2020-01-01 00:00:04 NaN
4 55 100 2020-01-01 00:00:07 NaN
5 55 88 2020-01-01 00:00:07 0.88
推荐阅读
- html - 想用 css 或 jquery 对图像进行滚动效果
- ios - IOS 启动屏幕故事板以不同的方向显示
- javascript - Discord.js 如何在命令行中使用空格键?
- html - 当我在 bootstarp 4 的容器流体中使用自定义类时,“行”中的对齐项目不起作用?
- mysql - 基于 Node.js 级别(api key)的速率限制
- choroplethr - 使用 Choroplethr 为表格值分配颜色
- java - 获取 XML 注释值
- phpstorm - IntelliJ/PhpStorm:如何搜索“不在路径中”
- java - Docker:无法在 ktor 应用程序中打开从容器到主机的端口
- c - GTK 自定义小部件(按钮):无法在 _init 中设置按钮标签