熊猫会删除双重条件的重复项

时间:2018-09-12 21:04:09

标签: python pandas

考虑以下DF

    import pandas as pd
    df = pd.DataFrame({'ID': [1,1,1,1,2,2,2,2], 
    'Course': 
    ['English','English','English','History','Science', 'Science', 'Science','Math'],
    'Status':
    ['Attended', 'Requested', 'Partially Attended', 'No show',
    'Requested','Attended','Partially Attended','No show']})
    df.set_index(['ID'])
    print(df)

Course  Status
ID      
1   English Attended
1   English Requested
1   English Partially Attended
1   History No show
2   Science Requested
2   Science Attended
2   Science Partially Attended
2   Math    No show

我正在尝试根据以下3个假设找出一种删除重复项的方法。

  1. ID出现多次。
  2. ID多次出现的过程必须相同。 (所以1,历史和2,数学都可以保留)
  3. 如果找到匹配项,那么我想放入课程完成且有请求的实例中,并删除带有请求的行。没有出现和部分出席可以。

我目前正在学习和学习DataCamps Python和pandas课程,因此我熟悉groupby,aggregate,sort函数,可以在其中删除带有时间序列数据的更高版本或更高版本。我不知道如何将条件或逻辑应用于放置函数。我已经在该论坛中搜索了类似的功能,但没有对自己的DF应用任何功能。

我想要的结果如下:

Course  Status
ID      
1   English Attended
1   English Partially Attended
1   History No show
2   Science Attended
2   Science Partially Attended
2   Math    No show

1 个答案:

答案 0 :(得分:2)

不是duplicated还是不是Requested

df[~df.duplicated(['ID', 'Course'], keep=False) | df.Status.ne('Requested')]

    Course  ID              Status
0  English   1            Attended
2  English   1  Partially Attended
3  History   1             No show
5  Science   2            Attended
6  Science   2  Partially Attended
7     Math   2             No show

pandas.DataFrame.duplicated

标识事物是否重复。我传递了一个列名列表,用于确定重复性。通过使用keep=False,我指定我也想将第一次出现或最后一次出现也计为重复项。

df.duplicated(['ID', 'Course'], keep=False)

0     True
1     True
2     True
3    False
4     True
5     True
6     True
7    False
dtype: bool

但是,如果它是重复项,还要检查它是否为Requested

df.Status.ne('Requested')

0     True
1    False
2     True
3     True
4    False
5     True
6     True
7     True
Name: Status, dtype: bool

因此,我们希望行不是重复的,并且如果行至少不等于Status