根据不同列中的多个条件过滤数据框

Filter dataframe on multiple conditions within different columns

我有下面给出的数据框样本。

data = {'ID':['A', 'A', 'A', 'A', 'A', 'B','B','B','B'],
    'Date':['2021-2-13', '2021-2-14', '2021-2-14', '2021-2-14', '2021-2-15', '2021-2-14', '2021-2-14', '2021-2-15', '2021-2-15'],
    'Modified_Date':['3/19/2021  6:34:20 PM','3/20/2021  4:57:39 PM', '3/21/2021  4:57:40 PM', '3/22/2021  4:57:57 PM', '3/23/2021  4:57:41 PM',
                    '3/25/2021  11:44:15 PM','3/26/2021  2:16:09 PM', '3/20/2021  2:16:04 PM', '3/21/2021  4:57:40 PM'],
    'Steps': [1000, 1200, 1500, 2000, 1400, 4000, 5000,1000, 3500]}
df1 = pd.DataFrame(data)

df1

必须以这样的方式过滤此数据,即首先为 'ID',然后为每个 'Date',必须选择 'Modified_Date' 行的最新条目。
例如:对于 ID=A,对于日期='2021-04-14',latest/last 修改日期 = '3/22/2021 4:57:57 PM',必须选择此行。

我附上了最终数据框的样子的片段。

我一直卡在这个问题上。

尝试:

df1["Date"] = pd.to_datetime(df1["Date"])
df1["Modified_Date"] = pd.to_datetime(df1["Modified_Date"])

df_out = df1.groupby(["ID", "Date"], as_index=False).apply(
    lambda x: x.loc[x["Modified_Date"].idxmax()]
)
print(df_out)

打印:

  ID       Date       Modified_Date  Steps
0  A 2021-02-13 2021-03-19 18:34:20   1000
1  A 2021-02-14 2021-03-22 16:57:57   2000
2  A 2021-02-15 2021-03-23 16:57:41   1400
3  B 2021-02-14 2021-03-26 14:16:09   5000
4  B 2021-02-15 2021-03-21 16:57:40   3500

或者:.sort_values + .groupby:

df_out = (
    df1.sort_values(["ID", "Date", "Modified_Date"])
    .groupby(["ID", "Date"], as_index=False)
    .last()
)

easiest/most 直截了当的是按日期排序并取每组最后一个:

(df1.sort_values(by='Modified_Date')
    .groupby(['ID', 'Date'], as_index=False).last()
)

输出:

  ID       Date          Modified_Date  Steps
0  A  2021-2-13  3/19/2021  6:34:20 PM   1000
1  A  2021-2-14  3/22/2021  4:57:57 PM   2000
2  A  2021-2-15  3/23/2021  4:57:41 PM   1400
3  B  2021-2-14  3/26/2021  2:16:09 PM   5000
4  B  2021-2-15  3/21/2021  4:57:40 PM   3500

您还可以 sort_values 和 drop_duplicates:

首先将 2 个系列转换为日期(因为它们在示例中是字符串):

df1["Date"] = pd.to_datetime(df1["Date"])
df1["Modified_Date"] = pd.to_datetime(df1["Modified_Date"])

然后对 Modified_date 和 drop_duplicates 上的值进行排序,保留最后一个值:

out = df1.sort_values('Modified_Date').drop_duplicates(['ID','Date'],keep='last')\
         .sort_index()
print(out)

  ID       Date       Modified_Date  Steps
0  A 2021-02-13 2021-03-19 18:34:20   1000
3  A 2021-02-14 2021-03-22 16:57:57   2000
4  A 2021-02-15 2021-03-23 16:57:41   1400
6  B 2021-02-14 2021-03-26 14:16:09   5000
8  B 2021-02-15 2021-03-21 16:57:40   3500