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)]
?这是一个非常好的解决方案,非常感谢。这是一个非常好的解决方案,非常感谢。