Python-如何在第一行条件下提取子集

时间:2019-01-17 12:08:57

标签: python pandas dataframe

我正在寻找一种方法,以获取由 ID Date Diff Class 0 010101 11/12/2008 NaN Good 1 010102 02/07/2008 NaN Very Good 2 010102 08/07/2008 6.0 Bad 3 010103 12/02/2009 NaN Very Bad 4 010104 07/05/2007 NaN Very Good 获得的第一行带有条件的子集,让我们来看一个更清楚的示例:

Very Good

由于每个ID属于第一类,因此我正在寻找一种获取以下子集的方法,此处 ID Date Diff Class 010102 02/07/2008 NaN Very Good 010102 08/07/2008 6.0 Bad 010104 07/05/2007 NaN Very Good 首次出现:

import pandas as pd

df = pd.DataFrame(
    [
        {"ID": 010101, "Date": '11/12/2008', "Class" : "Good"},
        {"ID": 010102, "Date": '02/07/2008', "Class" : "Very Good"},
        {"ID": 010102, "Date": '08/07/2008', "Diff": 6.0 , "Class" : "Bad"},
        {"ID": 010103, "Date": '12/02/2009', "Class" : "Very Bad"},
        {"ID": 010104, "Date": '07/05/2007', "Class" : "Very Good"},
    ],
    columns=["ID", "Date", "Diff", "Class"],
)

感谢您的帮助,

app:drawableLeftCompat

1 个答案:

答案 0 :(得分:1)

基于注释,似乎您想过滤到该ID的第一个日期为“非常好”的ID。我假设您的数据帧称为df

首先,我们应将您的Date列转换为正确的pandas日期时间,以确保其正确排序(我假设此处的日期为dd / mm / yyyy):

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)

然后,我们用IDDate进行排序,在ID上分组,并返回得到的第一行(由于排序,该行将是该{ {1}}。

ID

由此,我们可以计算出第一行中的first_entry = df.sort_values(by=['ID', 'Date']).groupby('ID', as_index=False).first() Class,并选择这些ID值:

Very Good

最后,我们可以使用这些ID值来过滤原始数据帧。

vg = first_entry[first_entry['Class'] == 'Very Good']['ID']

这给我们:

matches = df[df['ID'].isin(vg)]