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]])
我正在使用这个数据框:
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]])