gpt4 book ai didi

python - 在 Pandas 中按组保留 X% 的最后一行

转载 作者:行者123 更新时间:2023-12-03 15:10:15 31 4
gpt4 key购买 nike

使用类似 df.groupby('ID').tail(N) 的内容将每个组的最后 N 行保留在数据框中很简单。 .
就我而言,组有不同的大小,我希望每个组保持相同的百分比而不是相同的行数。
例如,如果我们想为以下每个组(基于 ID)保留最后 50% 的行:

df = pd.DataFrame({'ID' : ['A','A','B','B','B','B','B','B'], 
'value' : [1,2,10,11,12,13,14,15]})
结果是:
 pd.DataFrame({'ID' : ['A','A','B','B','B','B','B','B'], 
'value' : [2,13,14,15]})
我们怎样才能做到这一点?
编辑:如果 x% 不是 int,我们四舍五入到最小的更接近的 int。

最佳答案

groupby - apply - tail将所需大小传递给 tail() GroupBy.apply() .这比 iloc 更简单下面的方法,因为它干净地处理了“最后 0 行”的情况。

ratio = 0.6
(df.groupby('ID')
.apply(lambda x: x.tail(int(ratio * len(x))))
.reset_index(drop=True))

# ID value
# 0 A 2
# 1 B 13
# 2 B 14
# 3 B 15
ratio = 0.4
(df.groupby('ID')
.apply(lambda x: x.tail(int(ratio * len(x))))
.reset_index(drop=True))

# ID value
# 0 B 14
# 1 B 15
groupby - apply - iloc或者,通过 iloc 索引所需的大小/slicing,但自从 [-0:] 以来,这更笨拙实际上并没有得到最后 0 行,所以我们必须检查:
ratio = 0.6
(df.groupby('ID')
.apply(lambda x: x[-int(ratio * len(x)):] if int(ratio * len(x)) else None)
.reset_index(drop=True))

# ID value
# 0 A 2
# 1 B 13
# 2 B 14
# 3 B 15
ratio = 0.4
(df.groupby('ID')
.apply(lambda x: x[-int(ratio * len(x)):] if int(ratio * len(x)) else None)
.reset_index(drop=True))

# ID value
# 0 B 14
# 1 B 15

关于python - 在 Pandas 中按组保留 X% 的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66557891/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com