如何从DataFrame Pandas动态删除行

时间:2019-01-17 00:37:44

标签: python pandas dataframe

我有以下NFL跟踪数据:

    Event  PlayId  FrameId   x-coord  y-coord
0   Start       1       1       20.2     20.0
1     NaN       1       2       21.0     19.1
2     NaN       1       3       21.3     18.3
3     NaN       1       4       22.0     17.5
4     End       1       5       22.5     17.2
4     NaN       1       6       22.5     17.2
4     NaN       1       7       22.5     17.2
4     NaN       1       8       22.5     17.2
4     NaN       1       9       22.5     17.2
4     NaN       1       10      22.5     17.2
5     NaN       2       1       23.0     16.9
6   Start       2       2       23.6     16.7
7     End       2       3       25.1     34.1
8     NaN       2       4       25.9     34.2
10    NaN       3       1       22.7     34.2
11    Nan       3       2       21.5     34.5
12    NaN       3       3       21.1     37.3
13  Start       3       4       21.2     44.3
14    NaN       3       5       20.4     44.6
15    End       3       6       21.9     42.7

如何过滤此列表以仅获取“事件”列的“开始”和“结束”值之间的行?为了澄清,这是我要过滤的数据:

    Event  PlayId  FrameId   x-coord  y-coord
0   Start       1       1       20.2     20.0
1     NaN       1       2       21.0     19.1
2     NaN       1       3       21.3     18.3
3     NaN       1       4       22.0     17.5
4     End       1       5       22.5     17.2
6   Start       2       2       23.6     16.7
7     End       2       3       25.1     34.1
13  Start       3       4       21.2     44.3
14    NaN       3       5       20.4     44.6
15    End       3       6       21.9     42.7

显式解决方案将不起作用,因为实际数据集非常大,并且无法预测起始值和结束值的落差。

1 个答案:

答案 0 :(得分:2)

先用slice和ffill然后再用concat返回,在df中也有Nan,应该是NaN吗?

df1=df.copy()

newdf=pd.concat([df1[df.Event.ffill()=='Start'],df1[df.Event=='End']]).sort_index()
newdf
    Event  PlayId  FrameId  x-coord  y-coord
0   Start       1        1     20.2     20.0
1     NaN       1        2     21.0     19.1
2     NaN       1        3     21.3     18.3
3     NaN       1        4     22.0     17.5
4     End       1        5     22.5     17.2
6   Start       2        2     23.6     16.7
7     End       2        3     25.1     34.1
13  Start       3        4     21.2     44.3
14    NaN       3        5     20.4     44.6
15    End       3        6     21.9     42.7

newdf=df[~((df.Event.ffill()=='End')&(df.Event.isna()))]
newdf
    Event  PlayId  FrameId  x-coord  y-coord
0   Start       1        1     20.2     20.0
1     NaN       1        2     21.0     19.1
2     NaN       1        3     21.3     18.3
3     NaN       1        4     22.0     17.5
4     End       1        5     22.5     17.2
6   Start       2        2     23.6     16.7
7     End       2        3     25.1     34.1
13  Start       3        4     21.2     44.3
14    NaN       3        5     20.4     44.6
15    End       3        6     21.9     42.7