【问题标题】:Retain the last N records of each group in a pandas DataFrame在 pandas DataFrame 中保留每组的最后 N 条记录
【发布时间】:2023-01-23 20:19:53
【问题描述】:

我有一个 pandas df,如下所示。

df = pd.DataFrame({'a':['ABC', 'ABC', 'DEF', 'DEF', 'DEF', 'DEF'], 'b':['1', '1', '2', '2', '2', '2'], 'c':[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]})

    a    b    c
0  ABC   1    0.1
1  ABC   1    0.2
2  DEF   2    0.3
3  DEF   2    0.4
4  DEF   2    0.5
5  DEF   2    0.6

我想将每个“组”(ABC、DEF)的最后“n”行保留在“a”列中,其中“n”取决于“b”中的值。我的结果应该是一个新的 df 看起来像这样

    a    b    c
1  ABC   1    0.2
4  DEF   2    0.5
5  DEF   2    0.6

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用groupbytail

    df.groupby('a', group_keys=False).apply(
        lambda x: x.tail(int(x['b'].iloc[0])))
    
         a  b    c
    1  ABC  1  0.2
    4  DEF  2  0.5
    5  DEF  2  0.6
    

    这假设该组的 col "b" 中的所有值都相等,因此该组中的第一个值用于计算尾部。


    如果您需要在每组中保留相同数量的行,则解决方案简化为

    df.groupby('a').tail(n)
    

    【讨论】:

    • 谢谢你!我有一列 d = 'date' 并希望保留 'n' 个最新日期行。这似乎有效 df.sort_values('date').groupby('a', group_keys=False).apply( lambda x: x.tail(int(x['b'].iloc[0])))
    • @idt_tt 是的,我想先按日期排序,然后使用 groupby('a', group_keys=False, sort=False).apply(...) 会起作用
    • 谢谢。如果我想在按日期排序后使用列“b”中的最后一个值怎么办?
    • @idt_tt 将int(x['b'].iloc[0]) 更改为int(x['b'].iloc[-1]),其中-1 是最后一个值的索引。
    【解决方案2】:

    如果 b 不总是增加 cumcount

    df=df[df.iloc[::-1,].groupby('a').c.cumcount().lt(df.b.astype(int))]
    df
    Out[268]: 
         a  b    c
    1  ABC  1  0.2
    4  DEF  2  0.5
    5  DEF  2  0.6
    

    【讨论】:

    • 但也许 c 并不总是在增加?
    • @yatu 然后它是 cumcount
    • 但我认为这仍然没有做到,这会保留每组 iiuc 中第 n 行之后的所有行,对吗? op 想要每组最后 n 个,n 在 b 中指定
    • @yatu 所以颠倒顺序做同样的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多