【问题标题】:self join in pythoon data frame在python数据框中自我加入
【发布时间】:2021-12-31 04:00:58
【问题描述】:

我在 python 数据框中有 5 列:

s.no, customer_id,status     issue_date, action_date, resolve_date
1234   600123     resolved    10-10-2021   11-11-2021   12-11-2021
1235   600123     resolved    15-10-2021   11-11-2021   12-11-2021
1236   600123     resolved    16-10-2021   11-11-2021   12-11-2021
1237   700673     in-progress 17-10-2021   29-10-2021   
1238   700673     in-progress 18-10-2021    
1239   800165     submitted   20-10-2021
1239   800165     submitted   21-10-2021    

有四种状态(已提交、进行中、已解决、已取消)。 S.no 将自动递增,并且客户 ID 是唯一的。同一个客户可以提出多个问题。 在客户提出的所有问题都得到解决之前,CS 团队无法将问题标记为已解决,并且所有问题都会显示为进行中。

我需要帮助为每位客户获取一行,其中包含初始问题提交日期 (issue_date)、最长操作日期和最长解决日期。例如,如果提出了 4 个问题,任何问题仍有待解决,则 issue_date 应为(第一个 issue 日期)的初始日期,action date 将是最迟日期,并且解决日期应为 null

样本输出应按 customer_id 分组

customer_id,status  ,issue_date, action_date, resolve_date
600123     resolved  10-10-2021   11-11-2021   12-11-2021
700673    in-progress 17-10-2021   29-10-2021   NULL
800165     submitted   21-10-2021  NULL         NULL

【问题讨论】:

  • 请在问题中显示您的数据框示例,以及包含您期望的输出的另一个示例数据框。
  • 可能先运行.groupby("customer_id"),然后运行first()last()max()

标签: python pandas dataframe self-join


【解决方案1】:

首先您可以使用groupby("customer_id") 分别与每个客户合作,

接下来,您可以使用agg() (aggregation) 分别为每一列(在组中)运行max()min()last()first() 等。

text = '''s.no customer_id status     issue_date action_date resolve_date
1234   600123     resolved    10-10-2021   11-11-2021   12-11-2021
1235   600123     resolved    15-10-2021   11-11-2021   12-11-2021
1236   600123     resolved    16-10-2021   11-11-2021   12-11-2021
1237   700673     in-progress 17-10-2021   29-10-2021   
1238   700673     in-progress 18-10-2021    
1239   800165     submitted   20-10-2021
1239   800165     submitted   21-10-2021    '''

import pandas as pd
import io

df = pd.read_csv(io.StringIO(text), sep="\s+")
df['issue_date'] = pd.to_datetime(df['issue_date'])
df['action_date'] = pd.to_datetime(df['action_date'])
df['resolve_date'] = pd.to_datetime(df['resolve_date'])

print(df)

df_new = df.groupby('customer_id').agg({'status':'last', 'issue_date': 'first', 'action_date': 'max', 'resolve_date': 'last'})

df_new = df_new.reset_index()

print(df_new)

结果:

   s.no  customer_id       status issue_date action_date resolve_date
0  1234       600123     resolved 2021-10-10  2021-11-11   2021-12-11
1  1235       600123     resolved 2021-10-15  2021-11-11   2021-12-11
2  1236       600123     resolved 2021-10-16  2021-11-11   2021-12-11
3  1237       700673  in-progress 2021-10-17  2021-10-29          NaT
4  1238       700673  in-progress 2021-10-18         NaT          NaT
5  1239       800165    submitted 2021-10-20         NaT          NaT
6  1239       800165    submitted 2021-10-21         NaT          NaT

   customer_id       status issue_date action_date resolve_date
0       600123     resolved 2021-10-10  2021-11-11   2021-12-11
1       700673  in-progress 2021-10-17  2021-10-29          NaT
2       800165    submitted 2021-10-20         NaT          NaT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2018-12-11
    • 2022-01-01
    • 2020-03-18
    相关资源
    最近更新 更多