【问题标题】:Row Number using multiple columns in a Pandas Dataframe在 Pandas Dataframe 中使用多列的行号
【发布时间】:2023-02-05 20:48:26
【问题描述】:

我有以下数据集:

timestamp   conversationId   UserId  MessageId       tpMessage   Message 
1614578324  ceb9004ae9d3    1c376ef 5bbd34859329    question    Where do you live?
1614578881  ceb9004ae9d3    1c376ef d3b5d3884152    answer      Brooklyn
1614583764  ceb9004ae9d3    1c376ef 0e4501fcd61f    question    What's your name?
1614590885  ceb9004ae9d3    1c376ef 97d841b79ff7    answer      Phill
1614594952  ceb9004ae9d3    1c376ef 11ed3fd24767    question    What's your gender?
1614602036  ceb9004ae9d3    1c376ef 601538860004    answer      Male
1614602581  ceb9004ae9d3    1c376ef 8bc8d9089609    question    How old are you?
1614606219  ceb9004ae9d3    1c376ef a2bd45e64b7c    answer      35
1614606240  jto9034pe0i5    1c489rl o6bd35e64b5j    question    What's your name?
1614606250  jto9034pe0i5    1c489rl 96jd89i55b7t    answer      Robert  

我正在尝试在熊猫中使用类似的 ROW_NUMBER 函数

ROW_NUMBER() OVER(PARTITION BY userId ORDER BY UserId,timestamp,conversationId    ASC) AS num_Row

到目前为止,我尝试了一些方法,但都没有按预期工作:

df['row_number'] = df.groupby(['userId','timestamp','conversationId']).cumcount() + 1

或者

df['row_number'] = df.sort_values(['userId','timestamp','conversationId'], ascending=[True,False]) \
             .groupby(['userId']) \
             .cumcount() + 1
print(df)

我想要的输出如下:

timestamp   conversationId   UserId  MessageId       tpMessage   Message                num_row     
1614578324  ceb9004ae9d3    1c376ef 5bbd34859329    question    Where do you live?  1
1614578881  ceb9004ae9d3    1c376ef d3b5d3884152    answer      Brooklyn            2
1614583764  ceb9004ae9d3    1c376ef 0e4501fcd61f    question    What's your name?   3
1614590885  ceb9004ae9d3    1c376ef 97d841b79ff7    answer      Phill               4
1614594952  ceb9004ae9d3    1c376ef 11ed3fd24767    question    What's your gender? 5
1614602036  ceb9004ae9d3    1c376ef 601538860004    answer      Male                6
1614602581  ceb9004ae9d3    1c376ef 8bc8d9089609    question    How old are you?    7
1614606219  ceb9004ae9d3    1c376ef a2bd45e64b7c    answer      35                  8
1614606240  jto9034pe0i5    1c489rl o6bd35e64b5j    question    What's your name?   1
1614606250  jto9034pe0i5    1c489rl 96jd89i55b7t    answer      Robert              2

你们能帮忙吗?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您上次尝试的变体,它提供了提供的输出并匹配逻辑:

    df['num_row'] = (df
      .sort_values(by=['UserId', 'timestamp', 'conversationId'],
                   ascending=True) # this is the default
      .groupby('UserId').cumcount().add(1)
    )
    

    输出:

        timestamp conversationId   UserId     MessageId tpMessage              Message  num_row
    0  1614578324   ceb9004ae9d3  1c376ef  5bbd34859329  question   Where do you live?        1
    1  1614578881   ceb9004ae9d3  1c376ef  d3b5d3884152    answer             Brooklyn        2
    2  1614583764   ceb9004ae9d3  1c376ef  0e4501fcd61f  question    What's your name?        3
    3  1614590885   ceb9004ae9d3  1c376ef  97d841b79ff7    answer                Phill        4
    4  1614594952   ceb9004ae9d3  1c376ef  11ed3fd24767  question  What's your gender?        5
    5  1614602036   ceb9004ae9d3  1c376ef  601538860004    answer                 Male        6
    6  1614602581   ceb9004ae9d3  1c376ef  8bc8d9089609  question     How old are you?        7
    7  1614606219   ceb9004ae9d3  1c376ef  a2bd45e64b7c    answer                   35        8
    8  1614606240   jto9034pe0i5  1c489rl  o6bd35e64b5j  question    What's your name?        1
    9  1614606250   jto9034pe0i5  1c489rl  96jd89i55b7t    answer               Robert        2
    

    【讨论】:

    • 嘿@mozway 感谢您的回答,它有效,我的尝试和您的代码之间的唯一区别是您以不同的方式将 1 添加到 cumcount()?你能解释一下吗?
    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2014-03-30
    • 2018-02-02
    • 2020-09-13
    • 2020-09-01
    • 2017-12-09
    • 2021-04-18
    • 2017-07-22
    相关资源
    最近更新 更多