Pandas 过滤到组内的特定值

Pandas filter up to a specific value within a group

我正在使用这个数据框:

Keyword    URL    Type              Position_Group 
A          A      Ad                1      
A          B      Ad                2       
A          C      Organic           1           
A          D      Organic           2          
A          E      Organic           3
A          F      Featured_Snippet  1           
..
A          P      Organic           20
A          Q      Organic           21
A          R      Ad                6     

我希望能够过滤到 Type = Organic & Position_Group <= 20 同时也包含其他 Type (Ad & Featured_Snippet) 因为它的结果属于前 20 个有机位置。此用例的目标是能够过滤最多前 20 个 Organic 个位置,同时捕获中间的其他 Type 个位置。

预期的输出应该是这样的:

Keyword    URL    Type              Position_Group 
A          A      Ad                1
A          B      Ad                2             
A          C      Organic           1           
A          D      Organic           2          
A          E      Organic           3
A          F      Featured_Snippet  1           
..
A          P      Organic           20

提前致谢!

假设数据帧是df:

df.iloc[: list(df[(df["Type"] == "Organic") & (df["Position_Group"] == 20)].index)[0]+1]

这通过 Type == "Organic"Position_Group == 20 过滤数据帧,然后 returns 列表的索引并获取第一项(应该只有一个项目,但我找到了该列表是获取实际值所必需的,而不是 Int64Index([6], dtype='int64'))。 1 添加到此以便包含它,并且从数据帧中获取到那里的行。

编辑

for each x in Keyword的相加,可以用for循环完成:

for i, j in df.groupby("Keyword"):
    j.reset_index(drop=True, inplace=True)
    print(j.iloc[: list(j[(j["Type"] == "Organic") & (j["Position_Group"] == 20)].index)[0]+1])

我在这里使用了 print,但是如果您想创建一个只有这些行的新数据框:

df2 = pd.DataFrame(columns=df.columns)

for i, j in df.groupby("Keyword"):
    j.reset_index(drop=True, inplace=True)
    df2 = pd.concat([df2, j.iloc[: list(j[(j["Type"] == "Organic") & (j["Position_Group"] == 20)].index)[0]+1]])