根据2个条件从数据框中删除行

SD_*_*_23 3 python dataframe python-3.x pandas

我有一个python数据框,其中包含多个季节的NHL Player数据。我正在尝试删除2018-2019年未参加比赛的所有玩家行。例如,如果乔·琼斯(Joe Jones)在2018-2019赛季打球,我想保留他那个赛季以及他打过的任何其他赛季的数据。

我在想代码看起来像这样:

for player in data.players:
      if data['Year'] == '2018-2019':
          save player's name
      else:
          remove player's data
Run Code Online (Sandbox Code Playgroud)

例如,我的数据框如下所示

Year         Player     TM     GP
2018-2019    Joe        MTL    78
2017-2018    Joe        MTL    82
2016-2017    Joe        MTL    80
2017-2018    Jim        STL    76
2016-2017    Jim        STL    82
2018-2019    Jack       MIN    82
Run Code Online (Sandbox Code Playgroud)

结果将是:

Year         Player     TM     GP
2018-2019    Joe        MTL    78
2017-2018    Joe        MTL    82
2016-2017    Joe        MTL    80 
2018-2019    Jack       MIN    82
Run Code Online (Sandbox Code Playgroud)

piR*_*red 5

groupby.filter

df.groupby('Player').filter(lambda d: '2018-2019' in {*d.Year})

        Year Player   TM  GP
0  2018-2019    Joe  MTL  78
1  2017-2018    Joe  MTL  82
2  2016-2017    Joe  MTL  80
5  2018-2019   Jack  MIN  82
Run Code Online (Sandbox Code Playgroud)

同样的事情,但使用values数组而不是set

df.groupby('Player').filter(lambda d: '2018-2019' in d.Year.values)
Run Code Online (Sandbox Code Playgroud)

与Numpy过度设计

m = df.Year.values == '2018-2019'
i, u = pd.factorize(df.Player)
a = np.zeros(len(u), bool)
np.logical_or.at(a, i, m)

df[a[i]]

        Year Player   TM  GP
0  2018-2019    Joe  MTL  78
1  2017-2018    Joe  MTL  82
2  2016-2017    Joe  MTL  80
5  2018-2019   Jack  MIN  82
Run Code Online (Sandbox Code Playgroud)