熊猫:多索引子集选择

问题描述 投票:1回答:2

下面的代码将产生一个代表四个玩家的数据框,每个玩家掷出两个掷骰子的掷骰子:

mux = pd.MultiIndex.from_arrays([
    list(['Alice', 'Alice', 'Alice', 
          'Bob', 'Bob', 'Bob', 'Bob', 'Bob', 
          'Carol', 'Carol', 'Carol', 'Carol', 'Carol', 'Carol', 
          'Dan', 'Dan']),
    list('1231234512345612')
], names=['player', 'roll'])

#df = pd.DataFrame({'die1': np.random.randint(1, 7, len(mux)),
#                   'die2': np.random.randint(1, 7, len(mux))}, mux)

df = pd.DataFrame({'die1': ['3','6','2','1','1','6','5','1','3','1','4','5','3','5','5','5'],
                   'die2': ['2','5','1','4','1','6','3','5','6','4','5','1','4','4','3','6']}, mux)

这是产生的数据框:

            die1 die2
player roll          
Alice  1       3    2
       2       6    5
       3       2    1
Bob    1       1    4
       2       1    1
       3       6    6
       4       5    3
       5       1    5
Carol  1       3    6
       2       1    4
       3       4    5
       4       5    1
       5       3    4
       6       5    4
Dan    1       5    3
       2       5    6

我对玩家感兴趣-不仅是个人掷骰,而且是玩家-在第一个骰子上掷出6。

下面的代码执行我所不希望的,它返回第一个骰子为6的单个卷:df[df.die1=='6']

             die1   die2
player  roll        
Alice   2    6      5
Bob     3    6      6

[我如何通过使用die1产生以下内容,而没有提及我显然不知道先验的各个玩家名称?

            die1 die2
player roll          
Alice  1       3    2
       2       6    5
       3       2    1
Bob    1       1    4
       2       1    1
       3       6    6
       4       5    3
       5       1    5
python pandas multi-index
2个回答
1
投票
ll=[]
for i, j in df.groupby('player'):
    if len(j[j.die1==6])>0:
        ll.append(j)
return pd.concat(ll)

1
投票

您可以进行groupby

# is your data string '6' or integer 6
df[df['die1'].eq('6').groupby('player').transform('any')]

输出:

            die1 die2
player roll          
Alice  1       3    2
       2       6    5
       3       2    1
Bob    1       1    4
       2       1    1
       3       6    6
       4       5    3
       5       1    5
© www.soinside.com 2019 - 2024. All rights reserved.