python-3.x - 如何做 groupby max 在 Pandas 数据框中创建新列

标签 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: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

在这里,我试图通过从状态日期列中获取条件等级 =1 的最大日期值并根据订单 ID 对它们进行分组来创建新列 act_0400 和 act_0500

预期产出
ORDER_ID    ACT_0400    ACT_0500
19837715    22/10/2019  22/10/2019
19837833    23/10/2019  23/10/2019
19840750                23/10/2019

如何在 Pandas 中做到这一点

最佳答案

您可以先转换STATUS_DATE到日期时间 to_datetime Series.dt.date ,然后按 boolean indexing 过滤与 Series.isin 最后由 DataFrame.pivot_table reshape 与聚合 max , 最后由 DataFrame.rename_axis 进行一些数据清理, DataFrame.rename_axis DataFrame.reset_index :

df['STATUS_DATE'] = pd.to_datetime(df['STATUS_DATE']).dt.date
df = (df[(df['RNK'] == 1) & df['CODE'].isin([400,500])]
        .pivot_table(index="ORDER_ID", columns="CODE", values="STATUS_DATE", aggfunc='max')
        .rename_axis(None, axis=1)
        .add_prefix('ACT_')
        .reset_index())
print (df)
   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

关于python-3.x - 如何做 groupby max 在 Pandas 数据框中创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59710943/

相关文章:

python - 是否可以在 OneHotEncoder 中为某些列指定 handle_unknown = 'ignore' 并为其他列指定 'error'?

python - Bokeh 'utf8' 编解码器无法解码字节 0xe9 : unexpected end of data

python - 如何消除数据框中的嵌套循环

python - pandas-两列的值是列表,需要生成一个新的 df 来显示它们之间的所有值组合

python - 添加两个大数字(一百万位)的最快方法

python-3.x - 如何在 pytest 中使用 Cython?

python - 在 Debian 操作系统上使用 pandas 从 github 存储库读取 csv 文件时出现奇怪的 csv 输出

python - Seaborn jointplot 颜色边际图分别

python - 为 Pandas Dataframe 中的重复集创建规则

python - 填充 pandas 数据框中的缺失值