首页 > 解决方案 > 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 的第一个数量(按时间)。

感谢您提供我需要更改代码的任何提示!

标签: pythonpandas

解决方案


没有对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

推荐阅读