【问题标题】:Dask dataframe: Get first row of each sorted groupDask数据框:获取每个排序组的第一行
【发布时间】:2020-12-22 09:46:12
【问题描述】:

我有一个包含以下格式的 dask 数据框:

import pandas as pd
import numpy as np
import dask.dataframe as dd

df = pd.DataFrame({'ID': [1, 1, 2, 3], 'Value': ['ABC', 'ABD', 'CDE', 'DEF'], 'Date': ['2020-10-10', '2019-10-12', '2019-01-08', np.nan]})
ddf = dd.from_pandas(df, npartitions=2)
ddf['Date'] = dd.to_datetime(ddf['Date'], dayfirst=True) # Convert to proper dtype
ddf.head()

输出:

  | ID | Value | Date
-------------------------
0 | 1. | ABC.  | 2020-10-10
1 | 1. | ABD.  | 2019-10-12
2 | 2. | CDE.  | 2019-01-08
3 | 3. | DEF.  | NaT

我需要在每个组中选择第一条记录,按日期排序并按 ID 分组。如果可能的话,如何在 dask 和 pandas 中实现这一点。

输出:

ID | Value | Date
-----------------------
1. | ABD.  | 2019-10-12
2. | CDE.  | 2019-01-08
3. | DEF.  | NaT

我尝试了什么:

使用:Get the Row(s) which have the max count in groups using groupby

ddf.set_index('Date').drop_duplicates('ID').head()
# Error: TypeError: '<' not supported between instances of 'NoneType' and 'int'
ddf.loc[ddf.groupby('ID')['Date'].idxmax()].head()
# Error: ValueError: Not all divisions are known, can't align partitions. Please use `set_index` to set the index.

请测试并发布答案,因为许多答案没有按预期工作。

【问题讨论】:

    标签: pandas dask dask-dataframe


    【解决方案1】:

    黎明

    ddf.set_index(ddf.Date.fillna(pd.to_datetime('2262-04-11'))).drop_duplicates('ID').set_index('ID').reset_index().compute()
    #   ID Value       Date
    #0   1   ABD 2019-10-12
    #1   2   CDE 2019-01-08
    #2   3   DEF        NaT
    

    (2262-04-11 是datetime64[ns] 的最大日期)

    熊猫

    df.sort_values(['ID', 'Date']).drop_duplicates('ID')
    #   ID Value        Date
    #1   1   ABD  2019-10-12
    #2   2   CDE  2019-01-08
    #3   3   DEF         NaN
    

    【讨论】:

    • 似乎工作正常。一个问题:用 2262-04-11 填充 NaT 会使 NaT 成为比任何非 NaT 都最大的日期,但如果我想成为最小的呢?
    • 在这种情况下,您可以使用 '1677-09-21' (pd.Timestamp.min) 但我不确定这是否真的有意义:任何 NaT-value 都将优先,即只要有任何 @ 987654327@ 对于给定的ID,结果将为NaT
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2017-03-19
    • 2017-10-17
    • 2016-11-12
    • 2017-08-20
    相关资源
    最近更新 更多