【问题标题】:Pandas keep the latest rows for the same ID with some conditional column valuesPandas 使用一些条件列值保留相同 ID 的最新行
【发布时间】:2022-01-17 12:46:16
【问题描述】:

我想保留具有相同 ID 的最新行以及与某些列值匹配的行。样本输入:

ID          Timestamp       Survey Outcome
12          11/26/2021      INCOMPLETE Survey
95          11/26/2021      INCOMPLETE Survey
95          11/27/2021      COMPLETE Survey
95          11/28/2021      RANG-But did not connect
12          11/29/2021      COMPLETE Survey
24          11/26/2021      RANG-But did not connect
24          11/27/2021      INCOMPLETE Survey
95          11/28/2021      RANG-But did not connect
24          11/28/2021      INCOMPLETE Survey

这里 ID 12 有两个值,所以我将保留最新的 (11/29/2021) 行。但是对于 ID 95,一旦调查完成,它就不能有任何其他选项,例如 rang-but did not connect。因此,我想保留最新的时间戳数据,并保留那些一旦数据完成调查但最新数据显示调查不完整未连接的行/em>(查看COMPLETE SURVEY后的所有数据)。

所以我的示例输出将是:

ID          Timestamp       Survey Outcome
95          11/27/2021      COMPLETE Survey
95          11/28/2021      RANG-But did not connect
12          11/29/2021      COMPLETE Survey
95          11/28/2021      RANG-But did not connect
24          11/28/2021      INCOMPLETE Survey```


【问题讨论】:

    标签: python pandas dataframe duplicates conditional-formatting


    【解决方案1】:

    首先使用DataFrame.sort_values by IDTimestamp,然后对COMPLETE Survey 之后的所有值使用GroupBy.cummax 并添加最后一个IDisin 不匹配的DataFrame.drop_duplicates

    df['Timestamp'] = pd.to_datetime(df['Timestamp'])
    df = df.sort_values(['ID','Timestamp'])
    
    m = df['Survey Outcome'].eq('COMPLETE Survey')
    
    df1 = df[m.groupby(df['ID']).cummax()]
    df2 = df.drop_duplicates('ID', keep='last')
    
    df = df1.append(df2[~df2['ID'].isin(df1['ID'])]).sort_index()
    
    print (df)
       ID  Timestamp            Survey Outcome
    2  95 2021-11-27           COMPLETE Survey
    3  95 2021-11-28  RANG-But did not connect
    4  12 2021-11-29           COMPLETE Survey
    7  95 2021-11-28  RANG-But did not connect
    8  24 2021-11-28         INCOMPLETE Survey
    

    【讨论】:

    • 它在我的代码中不起作用!!它只保留最后的完整数据。
    • @asifabdullah - 你认为样本数据吗?
    【解决方案2】:

    你可以使用:

    df['Timestamp'] = pd.to_datetime(df['Timestamp'])
    df.sort_values(by=['ID', 'Timestamp']).reset_index(drop=True, inplace=True)
    df = df.groupby('ID').apply(lambda x: x.loc[x[x['Survey Outcome'] == 'COMPLETE Survey'].index[0]: ] if
                                x['Survey Outcome'].isin(['COMPLETE Survey']).any() else x.loc[x['Timestamp'].idxmax():]).reset_index(drop=True)
    print(df)
    

    OUTPUT

       ID  Timestamp            Survey Outcome
    0  12 2021-11-29           COMPLETE Survey
    1  24 2021-11-28         INCOMPLETE Survey
    2  95 2021-11-27           COMPLETE Survey
    3  95 2021-11-28  RANG-But did not connect
    4  95 2021-11-28  RANG-But did not connect
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2021-12-16
      • 2020-01-18
      • 2021-12-04
      • 2022-03-04
      相关资源
      最近更新 更多