Python 熊猫:过滤groupby和/或pivot?
我正试图找出如何在使用pandas的组上下文中过滤大于/小于条件 在样本df中,有7组(a、b、c、d、e、f、g)。每组有1到6名球员。是否可以筛选出9-20之间的球员1得分组?将显示球员1得分在9-20之间的组(如输出所示) ps.最初的df要大得多,组中有10名以上的玩家和其他具有可变值的列 样本df: ╔═══════╦════════╦═══════╗ ║ Group ║ player ║ score ║ ╠═══════╬════════╬═══════╣ ║ a ║ 1 ║ 10 ║ ║ a ║ 2 ║ 20 ║ ║ a ║ 3 ║ 29 ║ ║ a ║ 4 ║ 22 ║ ║ a ║ 5 ║ 14 ║ ║ b ║ 1 ║ 16 ║ ║ b ║ 2 ║ 16 ║ ║ b ║ 3 ║ 17 ║ ║ c ║ 1 ║ 22 ║ ║ c ║ 2 ║ 23 ║ ║ c ║ 3 ║ 22 ║ ║ d ║ 1 ║ 13 ║ ║ d ║ 2 ║ 13 ║ ║ d ║ 3 ║ 23 ║ ║ d ║ 4 ║ 13 ║ ║ d ║ 5 ║ 34 ║ ║ e ║ 1 ║ 32 ║ ║ e ║ 2 ║ 29 ║ ║ e ║ 3 ║ 28 ║ ║ e ║ 4 ║ 19 ║ ║ e ║ 5 ║ 19 ║ ║ e ║ 6 ║ 27 ║ ║ f ║ 1 ║ 47 ║ ║ f ║ 2 ║ 17 ║ ║ f ║ 3 ║ 14 ║ ║ f ║ 4 ║ 25 ║ ║ g ║ 1 ║ 67 ║ ║ g ║ 2 ║ 21 ║ ║ g ║ 3 ║ 27 ║ ║ g ║ 4 ║ 16 ║ ║ g ║ 5 ║ 14 ║ ║ g ║ 6 ║ 25 ║ ╚═══════╩════════╩═══════╝ 非常感谢 关于IIUC,您可以使用withPython 熊猫:过滤groupby和/或pivot?,python,pandas,Python,Pandas,我正试图找出如何在使用pandas的组上下文中过滤大于/小于条件 在样本df中,有7组(a、b、c、d、e、f、g)。每组有1到6名球员。是否可以筛选出9-20之间的球员1得分组?将显示球员1得分在9-20之间的组(如输出所示) ps.最初的df要大得多,组中有10名以上的玩家和其他具有可变值的列 样本df: ╔═══════╦════════╦═══════╗ ║ Group ║ player ║ score ║ ╠═══════╬════════╬═══════╣ ║ a ║
df.groupby
和transform
withany
:
df[(df['players'].eq(1)&df['score'].between(9,20)).groupby(df['Group']).transform('any')]
找到满足条件的组,然后使用
isin
筛选这些组中包含的数据
df = pd.DataFrame(data)
groups_filter = (
df[df['players'].eq(1)
& df['score'].ge(9)
& df['score'].le(20)
]['Group'].unique()
)
>>> df[df['Group'].isin(groups_filter)]
Group players score
0 a 1 10
1 a 2 20
2 a 3 29
3 a 4 22
4 a 5 14
5 b 1 16
6 b 2 16
7 b 3 17
11 d 1 13
12 d 2 13
13 d 3 23
14 d 4 13
15 d 5 34
使用
查询的类似答案
:
df = pd.DataFrame(data)
groups = df.query(" players == 1 & (9 <= score <= 20) ")["Group"].unique()
df.loc[df["Group"].isin(groups)]
Group players score
0 a 1 10
1 a 2 20
2 a 3 29
3 a 4 22
4 a 5 14
5 b 1 16
6 b 2 16
7 b 3 17
11 d 1 13
12 d 2 13
13 d 3 23
14 d 4 13
15 d 5 34
df = pd.DataFrame(data)
groups_filter = (
df[df['players'].eq(1)
& df['score'].ge(9)
& df['score'].le(20)
]['Group'].unique()
)
>>> df[df['Group'].isin(groups_filter)]
Group players score
0 a 1 10
1 a 2 20
2 a 3 29
3 a 4 22
4 a 5 14
5 b 1 16
6 b 2 16
7 b 3 17
11 d 1 13
12 d 2 13
13 d 3 23
14 d 4 13
15 d 5 34
df = pd.DataFrame(data)
groups = df.query(" players == 1 & (9 <= score <= 20) ")["Group"].unique()
df.loc[df["Group"].isin(groups)]
idx = pd.IndexSlice
df_reid = df.set_index(["Group", "players"])
mask = df_reid[idx["score"]].between(9, 20)
groups = df_reid.loc[idx[mask,1],:].index.get_level_values("Group") # 1 means players == 1
df.loc[df["Group"].isin(groups)]