【问题标题】:If-elif-else combined with group-by to create new columnif-elif-else 结合 group-by 创建新列
【发布时间】:2020-06-20 00:30:09
【问题描述】:

我有前 4 列,我想创建 *5 列:

user     date             visit_num     total_visits_user          *last_cust__visit*
1       1995-10-01            1                2                     1995-10-02 
1       1995-10-02            2                2                     1995-10-02  
2       1995-10-01            1                3                     1995-10-03
2       1995-10-02            2                3                     1995-10-03
2       1995-10-03            3                3                     1995-10-03
3       1995-10-01            1                5                     1995-10-05
3       1995-10-02            2                5                     1995-10-05
3       1995-10-03            3                5                     1995-10-05
3       1995-10-04            4                5                     1995-10-05
3       1995-10-05            5                5                     1995-10-05
4       1995-10-03            1                2                     1995-10-04
4       1995-10-04            2                2                     1995-10-04

*last_cust_ visit 是一个新列,显示客户最后一次访问的日期。

我尝试了 if、elif、else 与 groupby 的结合,但不幸的是我无法使其工作。

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 尝试更多地解释您的问题。并提供您的代码。

标签: python conditional-statements pandas-groupby


【解决方案1】:

您可以在user 上进行分组以获得date 的最大值并将其与原始数据框合并:

df['last_cust_visit'] = df.merge(df.groupby('user')['date'].max()
                                 .reset_index(), on='user', suffixes=('_', '')
                                 )['date']

它给出了预期:

    user        date  visit_num  total_visits_user last_cust_visit
0      1  1995-10-01          1                  2      1995-10-02
1      1  1995-10-02          2                  2      1995-10-02
2      2  1995-10-01          1                  3      1995-10-03
3      2  1995-10-02          2                  3      1995-10-03
4      2  1995-10-03          3                  3      1995-10-03
5      3  1995-10-01          1                  5      1995-10-05
6      3  1995-10-02          2                  5      1995-10-05
7      3  1995-10-03          3                  5      1995-10-05
8      3  1995-10-04          4                  5      1995-10-05
9      3  1995-10-05          5                  5      1995-10-05
10     4  1995-10-03          1                  2      1995-10-04
11     4  1995-10-04          2                  2      1995-10-04

【讨论】:

    【解决方案2】:

    简单的方法是使用pd.groupbytransform方法:

    df["last_cust_visit"] = df.groupby("user")["date"].transform('max')
    
    

    使用transform 输出数据帧将具有与df 相同的行数:

        user        date  visit_num  total_visits_user last_cust_visit
    0      1  1995-10-01          1                  2      1995-10-02
    1      1  1995-10-02          2                  2      1995-10-02
    2      2  1995-10-01          1                  3      1995-10-03
    3      2  1995-10-02          2                  3      1995-10-03
    4      2  1995-10-03          3                  3      1995-10-03
    5      3  1995-10-01          1                  5      1995-10-05
    6      3  1995-10-02          2                  5      1995-10-05
    7      3  1995-10-03          3                  5      1995-10-05
    8      3  1995-10-04          4                  5      1995-10-05
    9      3  1995-10-05          5                  5      1995-10-05
    10     4  1995-10-03          1                  2      1995-10-04
    11     4  1995-10-04          2                  2      1995-10-04
    

    【讨论】:

      猜你喜欢
      • 2014-03-09
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2017-07-03
      • 2017-11-27
      相关资源
      最近更新 更多