Python 熊猫:过滤groupby和/或pivot?

Python 熊猫:过滤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 ║

我正试图找出如何在使用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,您可以使用with
df.groupby
transform
with
any

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)]