gpt4 book ai didi

python - Pandas - 根据唯一值和不同的列日期时间过滤 DataFrame

转载 作者:行者123 更新时间:2023-12-03 21:41:26 25 4
gpt4 key购买 nike

我有以下数据名:

import numpy as np
import pandas as pd

df = {'ID': ['1','1','2', '2', '3', '3', '4', '4', '4'],
'USER' : ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'C'],
'DATE_VIEW': ['16/05/2019','18/05/2019', '16/03/2020', '18/03/2020', '16/07/2020', '21/07/2020', '13/02/2020', '14/02/2020', '15/02/2020'],
'DATE_ACCEPT': ['17/05/2019', np.nan, np.nan, '18/03/2020', '16/07/2020', np.nan, np.nan, '14/02/2020', np.nan],
}

df = pd.DataFrame(df)
df['DATE_VIEW'] = pd.to_datetime(df['DATE_VIEW'], format = '%d/%m/%Y')
df['DATE_ACCEPT'] = pd.to_datetime(df['DATE_ACCEPT'], format = '%d/%m/%Y')
df
enter image description here
我正在寻找一种保持独特的方式 df['ID']行如果 df['DATE_VIEW']小于 df['DATE_VIEW']df['DATE_ACCEPT]如果 df['DATE_VIEW'] 已填充并删除该行大于 df['DATE_VIEW']df['DATE_ACCEPT]已为该特定 df['ID'] 填充.预期输出如下:
enter image description here

最佳答案

您可以 groupby ID列和 transform获取 DATE_ACCEPT对于每一行,然后比较 DATE_VIEW到该日期:

df.loc[df['DATE_VIEW'].le(df.groupby('ID')['DATE_ACCEPT'].transform('max'))]
输出:
  ID USER  DATE_VIEW DATE_ACCEPT
0 1 A 2019-05-16 2019-05-17
2 2 A 2020-03-16 NaT
3 2 B 2020-03-18 2020-03-18
4 3 A 2020-07-16 2020-07-16
6 4 A 2020-02-13 NaT
7 4 B 2020-02-14 2020-02-14
附言你当然可以 reset_index(drop=True)之后,如果你想让它看起来和你预期的输出完全一样
更新 如果你想保留两个日期都是 np.nan 的行,您可以添加另一个 bool 掩码并使用 | 应用它:
# the original condition DATE_VIEW <= DATE_ACCEPT
m1 = df['DATE_VIEW'].le(df.groupby('ID')['DATE_ACCEPT'].transform('max'))

# both dates are np.nan
m2 = df[['DATE_VIEW', 'DATE_ACCEPT']].isna().all(axis=1)

df.loc[m1|m2]

关于python - Pandas - 根据唯一值和不同的列日期时间过滤 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67313904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com