我有一个数据集:

import pandas as pd

data = [
    ('A', 'X'),
    ('A', 'X'),
    ('A', 'Y'),
    ('A', 'Z'),
    ('B', 1),
    ('B', 1),
    ('B', 2),
    ('B', 2),
    ('B', 3),
    ('B', 3),
    ('C', 'L-7'),
    ('C', 'L-9'),
    ('C', 'L-9'),
    ('T', 2020),
    ('T', 2020),
    ('T', 2025)
]

df = pd.DataFrame(data, columns=['ID', 'SEQ'])
print(df)

我想创建一个关键字分组ID和SEQ,以便 Select 每个ID组中每个不同SEQ的前2行

例如,ID A按数据集的顺序具有3个不同的关键字"A X"、"A Y"和"A Z".前两个关键字是"A X"和"A Y",因此我必须 Select 每个关键字的前两行(如果可用

"A X","A X","A Y"为什么?因为"A-Z"是另一个关键字.

我try 使用Groupby和Head函数,但我找不到实现此特定结果的方法.有没有人能给我一个解决方案,或者给我指个方向?

(df
.groupby(['ID','SEQ'])
.head(2)
)

但正在削减原始数据集,我想知道你们是否可以帮助我解决这个问题使用方法更改,因为这是我在Pandas 中更喜欢的风格,提前谢谢

最终正确的输出是

enter image description here

推荐答案

您使用GROUPBY然后使用HEAD(2)的方法是正确的,可以获得每个ID组中每个不同SEQ的前2行.

但是,额外的要求是仅获取每个ID中的前两个唯一SEQ组.要实现这一点,您可以:

在每个ID组中创建一个等级为唯一SEQ的新列. 使用此排名可以筛选出数据. 最后,使用您原来的方法获取每个ID组中每个SEQ的前2行. 以下是使用方法链接的解决方案:

result = (df
          .assign(rank=df.groupby('ID')['SEQ'].transform(lambda x: x.rank(method='dense')))
          .query('rank <= 2')
          .groupby(['ID', 'SEQ'])
          .head(2)
          .drop(columns=['rank'])
         )

print(result)

这应该会为您提供所需的输出.

Python相关问答推荐

为什么Pydantic在我申报邮箱时说邮箱丢失

这些变量是否相等,因为它们引用相同的实例,尽管它们看起来应该具有不同的值?

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

根据多列和一些条件创建新列

Numpy索引argsorted使用integer数组,同时保留排序顺序

机器人与Pyton Minecraft服务器状态不和

查找下一个值=实际值加上使用极点的50%

数字梯度的意外值

如何根据另一列值用字典中的值替换列值

Python 3.12中的通用[T]类方法隐式类型检索

具有多个选项的计数_匹配

需要计算60,000个坐标之间的距离

根据二元组列表在pandas中创建新列

在Mac上安装ipython

我如何使法国在 map 中完全透明的代码?

梯度下降:简化要素集的运行时间比原始要素集长

Python Pandas获取层次路径直到顶层管理

基于形状而非距离的两个numpy数组相似性

具有相同图例 colored颜色 和标签的堆叠子图

为什么调用函数的值和次数不同,递归在代码中是如何工作的?