Python 3.x 如何使用groupby max在dataframe中创建新列
我有下面这样的数据框架,我想应用下面提到的sql逻辑Python 3.x 如何使用groupby max在dataframe中创建新列,python-3.x,pandas,dataframe,group-by,Python 3.x,Pandas,Dataframe,Group By,我有下面这样的数据框架,我想应用下面提到的sql逻辑 df.head(25) ORDER_ID CODE STATUS_DATE RNK 19837715 0400 22/10/19 08:11:08.000000000 AM GMT 2 19837715 0400 22/10/19 10:00:03.000000000 AM GMT 1 19837715 0400 22/10/19 10:47:0
df.head(25)
ORDER_ID CODE STATUS_DATE RNK
19837715 0400 22/10/19 08:11:08.000000000 AM GMT 2
19837715 0400 22/10/19 10:00:03.000000000 AM GMT 1
19837715 0400 22/10/19 10:47:08.000000000 AM GMT 3
19837715 0500 22/10/19 10:00:00.000000000 AM GMT 1
19837715 1100 01/11/19 10:02:00.000000000 AM GMT 1
19837715 1240 02/11/19 08:00:00.000000000 AM GMT 1
19837833 0400 22/10/19 08:13:09.000000000 AM GMT 3
19837833 0400 22/10/19 08:22:09.000000000 AM GMT 4
19837833 0400 23/10/19 04:30:10.000000000 AM GMT 1
19837833 0400 23/10/19 09:30:07.000000000 PM GMT 2
19837833 0500 23/10/19 01:08:00.000000000 AM GMT 1
19837833 0500 23/10/19 04:30:00.000000000 AM GMT 3
19840750 0500 23/10/19 12:30:00.000000000 PM GMT 1
19840750 1100 01/11/19 10:06:02.000000000 AM GMT 1
19840750 1240 02/11/19 08:40:05.000000000 AM GMT 1
19840750 1305 05/11/19 07:21:03.000000000 AM GMT 2
19840750 1305 05/11/19 08:22:03.000000000 AM GMT 1
19840750 1400 09/11/19 06:13:12.000000000 AM GMT 3
我想在这个数据帧上应用下面的sql逻辑
select
order_id
, TRUNC(MAX(decode(df.code, '0400', STATUS_DATE, Null))) act_0400
, TRUNC(MAX(decode(df.code, '0500', STATUS_DATE, Null))) act_0500
from
dataframe df
where
df.rnk =1
group by
order_id
在这里,我试图创建新列act_0400和act_0500,方法是从状态日期列中获取条件秩=1的最大日期值,并根据订单id对它们进行分组
预期产出
ORDER_ID ACT_0400 ACT_0500
19837715 22/10/2019 22/10/2019
19837833 23/10/2019 23/10/2019
19840750 23/10/2019
ORDER_ID ACT_400 ACT_500
0 19837715 22/10/19 22/10/19
1 19837833 23/10/19 23/10/19
2 19840750 NaN 23/10/19
如何在熊猫中实现这一点您可以按以下操作
a = df.loc[df['RNK']==1 & (df['CODE']==400) | (df['CODE']==500)]
a.pivot(index="ORDER_ID", columns="CODE", values="STATUS_DATE").add_prefix('ACT_').reset_index().rename_axis(None, axis=1)
输出
ORDER_ID ACT_0400 ACT_0500
19837715 22/10/2019 22/10/2019
19837833 23/10/2019 23/10/2019
19840750 23/10/2019
ORDER_ID ACT_400 ACT_500
0 19837715 22/10/19 22/10/19
1 19837833 23/10/19 23/10/19
2 19840750 NaN 23/10/19
你可以做如下的事情
a = df.loc[df['RNK']==1 & (df['CODE']==400) | (df['CODE']==500)]
a.pivot(index="ORDER_ID", columns="CODE", values="STATUS_DATE").add_prefix('ACT_').reset_index().rename_axis(None, axis=1)
输出
ORDER_ID ACT_0400 ACT_0500
19837715 22/10/2019 22/10/2019
19837833 23/10/2019 23/10/2019
19840750 23/10/2019
ORDER_ID ACT_400 ACT_500
0 19837715 22/10/19 22/10/19
1 19837833 23/10/19 23/10/19
2 19840750 NaN 23/10/19
以下是一种方法:
codes = [400, 500]
df1 = (df
.query("CODE in @codes and RNK == 1")
.groupby(['ORDER_ID','CODE'])['STATUS_DATE']
.first()
.unstack())
# fix column names
df1.columns.name = None
df1 = df1.add_prefix('ACT_').reset_index()
ORDER_ID ACT_400 ACT_500
0 19837715 2019-10-22 2019-10-22
1 19837833 2019-10-23 2019-10-23
2 19840750 NaN 2019-10-23
以下是一种方法:
codes = [400, 500]
df1 = (df
.query("CODE in @codes and RNK == 1")
.groupby(['ORDER_ID','CODE'])['STATUS_DATE']
.first()
.unstack())
# fix column names
df1.columns.name = None
df1 = df1.add_prefix('ACT_').reset_index()
ORDER_ID ACT_400 ACT_500
0 19837715 2019-10-22 2019-10-22
1 19837833 2019-10-23 2019-10-23
2 19840750 NaN 2019-10-23
您可以首先使用将状态日期转换为日期时间,然后使用过滤,最后使用聚合重新整形,最后使用清理数据,以及:
您可以首先使用将状态日期转换为日期时间,然后使用过滤,最后使用聚合重新整形,最后使用清理数据,以及:
逻辑并不完全清楚。你能解释一下你想做什么吗?另外,您是否也可以发布给定数据帧的预期输出?@Moys,我已经更新了预期输出。在这里,我试图创建新的列
act_0400
和act_0500
,方法是从状态日期列中获取条件秩=1的最大日期值,并根据顺序id对它们进行分组。逻辑不完全清楚。你能解释一下你想做什么吗?另外,您是否也可以发布给定数据帧的预期输出?@Moys,我已经更新了预期输出。在这里,我试图创建新的列act_0400
和act_0500
,方法是从条件秩=1的状态日期列中获取最大日期值,并根据订单id对它们进行分组