倒数第二个值(熊猫,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 列的某些单独组可能存在倒数第二个值,或者一个组将仅由一个值定义。你有解决办法吗? @VncJdf.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)的主要内容,如果未能解决你的问题,请参考以下文章