Python 如何根据列值获取组的前n条记录

Python 如何根据列值获取组的前n条记录,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我想知道如何使用groupby和head获得一组记录的前n个值,其中n在原始数据帧的一列中编码 import pandas as pd df = pd.DataFrame({"A": [1] * 4 + [2] * 3, "B": list(range(1, 8))}) gp = df.groupby("A").head(2) print(gp) 这将返回每组的前2条记录。如果我想要第一组中的第一个1和第二组中的第一个2,如列A中

我想知道如何使用
groupby
head
获得一组记录的前n个值,其中n在原始数据帧的一列中编码

import pandas as pd

df = pd.DataFrame({"A": [1] * 4 + [2] * 3, "B": list(range(1, 8))})
gp = df.groupby("A").head(2)
print(gp)

这将返回每组的前2条记录。如果我想要第一组中的第一个1和第二组中的第一个2,如列
A
中所编码的,我将如何进行

预期结果:

   A  B
0  1  1
4  2  5
5  2  6
df_uuz=pd.concat([gp[1]。头(i+1)表示i,枚举中的gp(df.groupby(“A”))
df_uuz=pd.concat([gp[1]。头(i+1)表示i,枚举中的gp(df.groupby(“A”))
以下是通过
A
传递
x.name
的自定义函数中的解决方案-以下是通过
A
值过滤的数据:

gp = df.groupby("A", group_keys=False).apply(lambda x: x.head(x.name))
print(gp)

   A  B
0  1  1
4  2  5
5  2  6
如果需要按顺序在
中进行筛选,
值解决方案是:

df = pd.DataFrame({"A": [8] * 4 + [6] * 3, "B": list(range(1, 8))})

d = {v: k for k, v in enumerate(df.A.unique(), 1)}
gp = df.groupby("A", group_keys=False, sort=False).apply(lambda x: x.head(d[x.name]))
print(gp)

   A  B
0  8  1
4  6  5
5  6  6
以下是通过
A
传递
x.name
的自定义函数中的解决方案-以下是通过
A
值过滤的数据:

gp = df.groupby("A", group_keys=False).apply(lambda x: x.head(x.name))
print(gp)

   A  B
0  1  1
4  2  5
5  2  6
如果需要按顺序在
中进行筛选,
值解决方案是:

df = pd.DataFrame({"A": [8] * 4 + [6] * 3, "B": list(range(1, 8))})

d = {v: k for k, v in enumerate(df.A.unique(), 1)}
gp = df.groupby("A", group_keys=False, sort=False).apply(lambda x: x.head(d[x.name]))
print(gp)

   A  B
0  8  1
4  6  5
5  6  6

我们可以使用
groupby
+
cumcount
创建一个顺序计数器,以唯一标识列
a
中每组中的行,然后创建一个布尔掩码,以标识计数器值小于或等于列
a
中编码的值的行,现在,我们可以使用此布尔掩码筛选所需的行

df[df.groupby('A').cumcount().add(1).le(df['A'])]


我们可以使用
groupby
+
cumcount
创建一个顺序计数器,以唯一标识列
a
中每组中的行,然后创建一个布尔掩码,以标识计数器值小于或等于列
a
中编码的值的行,现在,我们可以使用此布尔掩码筛选所需的行

df[df.groupby('A').cumcount().add(1).le(df['A'])]


pd.concat([df.groupby(“A”).get_group(1).head(1),df.groupby(“A”).get_group(2).head(2)]
pd.concat([df.groupby(“A”).get_group(1).head(1),df.groupby(“A”).get_group(2).head(2)]
?这是一个非常好的解决方案,非常感谢。这是一个非常好的解决方案,非常感谢。