倒数第二个值(熊猫,Python)

Posted

技术标签:

【中文标题】倒数第二个值(熊猫,Python)【英文标题】:Second last value (pandas, Python) 【发布时间】:2021-07-10 00:54:53 【问题描述】:

我有以下数据框:

index A B
0 a 3
1 a 4
2 b 9
3 b 6
4 a 2
5 b 1

我想获得每组“A”列的倒数第二个值。 我已经想出了如何使用 groupby 获取 min() 值:

df_grouped_last = df.groupby('A').agg('B': ['min'])

但我需要获取倒数第二个值(“最后一个”),这样我才能得到:

index A 2nd last B
0 a 3
1 b 6

在另一部作品中我还需要倒数第三和第四。

有人知道如何编码吗?

非常感谢! 文森特

【问题讨论】:

我认为a 的倒数第二个值将是4 而不是3 @VincJ 我认为您应该提到每个组都已排序 【参考方案1】:

查看您的预期输出,假设列 B 为每个组排序。如果是这种情况,请使用sort_values,结合nth:

(df.sort_values(['A', 'B'])
   .groupby('A', sort = False)
   .B
   .nth(-2) # familiar python construct ... 
            # takes second value from the bottom, per group
   .reset_index()
 )

   A  B
0  a  3
1  b  6

【讨论】:

【参考方案2】:

让我们试试sort_values 然后使用位置

out = df.sort_values('B').groupby('A').apply(lambda x : x.iloc[1])
Out[68]: 
   index  A  B
A             
a      0  a  3
b      3  b  6

【讨论】:

感谢您的回复,我有一个错误:IndexError: single positional indexer is out-of-bounds。我认为这是因为 A 列的某些单独组可能存在倒数第二个值,或者一个组将仅由一个值定义。你有解决办法吗? @VncJ df.sort_values('B').groupby('A').apply(lambda x : x.iloc[[1]] if len(x)>1 else x)【参考方案3】:

用途:

df = (df.groupby('A', as_index = False)['B']
        .agg('2nd last B': lambda x: x.iloc[-2] if len(x) > 1 else x))

输出:

>>> df
   A  2nd last B
0  a           4
1  b           6

【讨论】:

嗨,谢谢,但我的代码也有错误:IndexError: single positional indexer is out-of-bounds (see above). @VncJ 我猜在某些情况下,组中的行数不足,即组中的行数

以上是关于倒数第二个值(熊猫,Python)的主要内容,如果未能解决你的问题,请参考以下文章

为啥倒数第二个值被复制到数组的最后一个值上[重复]

Javafx中具有最大倒数的倒计时

如何用最后一个数字翻转字符串中的第一个数字,然后是倒数第二个和倒数第二个,依此类推?

Mongoose 从对象数组中查询倒数第二个项目

怎么取得一个数组中的倒数第二个元素

如何查找一行数据中倒数第二个非空单元格的内容呢?