代码之家  ›  专栏  ›  技术社区  ›  Windstorm1981

数据帧的复数子集

  •  2
  • Windstorm1981  · 技术社区  · 7 年前

    我有一个数据帧,其中一列中有不同的值。我想确保数据帧中每个唯一的列元素都有3个最新的条目。

          Group      Date        Value
            A        10/1/2017    4.4
            A        8/3/2017     9.2
            A        5/3/2017     8.4
            A        4/4/2017     4.4
            B        12/1/2015    4.4
            B        8/3/2015     9.2
            B        5/4/2015     8.4
            B        4/5/2015     4.4
    

    我想要:

          Group      Date        Value
            A        10/1/2017    4.4
            A        8/3/2017     9.2
            A        5/3/2017     8.4
            B        12/1/2015    4.4
            B        8/3/2015     9.2
            B        5/4/2015     8.4
    

    日期是日期时间。我不知道如何在这个职位上代表其他人。

    我可以用以下代码得到这个:

    new_df = pd.DataFrame()
    for group in df['Group'].unique():
    
        temp_df = df[df['Group'] == group]
        temp_df = temp_df[0:3]
    
        if new_df.empty:
    
           new_df = temp_df
    
        else:
    
           new_df.append(temp_df)
    

    有没有更像蟒蛇的方法?

    提前谢谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   rje    7 年前

    以下情况如何:

    df.sort_values(by='Date', ascending=False).groupby('Group').head(3)
    

    在我的小测试数据集上,它返回以下内容(我使用head(2)):

        Group   Date
    1   c   2050-01-01
    8   a   2032-02-03
    0   a   2030-01-01
    9   c   2029-01-01
    10  b   2018-01-01
    2   b   2017-02-03
    

    正如你所看到的,不同组的值并没有很好地组合在一起。我们可以先按“组”排序,然后按“日期”排序:

    df.sort_values(by=['Group', 'Date'], ascending=[True,False]).groupby('Group').head(3)
    
    
        Group   Date
    8   a   2032-02-03
    0   a   2030-01-01
    10  b   2018-01-01
    2   b   2017-02-03
    1   c   2050-01-01
    9   c   2029-01-01
    
        2
  •  2
  •   It_is_Chris    7 年前

    groupby 具有 nlargest :

    df.groupby(['Group'])['Date','Value'].apply(lambda x: x.nlargest(3,'Date'))
    
    
              Date      Value
    Group           
    A   0   2017-10-01  4.4
        1   2017-08-03  9.2
        2   2017-05-03  8.4
    B   4   2015-12-01  4.4
        5   2015-08-03  9.2
        6   2015-05-04  8.4