【问题标题】:Create a column in Pandas that counts the number of unique values in another column在 Pandas 中创建一列,计算另一列中唯一值的数量
【发布时间】:2018-03-15 22:12:16
【问题描述】:

我尝试了几种方法来使其正常工作,但没有任何效果。所以,我将在这里给出我的整个过程。

我有一个数据框,我正在尝试计算其中的 1 列。数据存储在 csv 文件中。这是我目前将其导入数据框的方法:

import pandas as pd
df = pd.read_csv('csvfile.csv')

我的数据框如下所示:

index  id  name  dob       visit
0      111 Joe   1/1/2000  1/1/2018
1      111 Joe   1/1/2000  1/5/2018
2      122 Bob   1/1/1999  2/8/2018
3      133 Jill  1/2/1988  7/9/2017
4      111 Joe   1/1/2000  12/31/2018

因为每个客户将根据他们的访问次数在数据框中有多行,所以我想创建一个列,其中包含他们的 id 号在 id 列下显示的次数的计数。

我尝试了以下方法:

df['counts'] = df.groupby('id').id.count()

但这给了我每一行的 NaN 值。如果我切换到 size(),再次是 NaN。所以我决定把结果做成一个系列:

visits = df.groupby('id').id.count()

这给了我:

index  id
111    3
122    1
133    1

这不是我所需要的,但很接近。然后我尝试使用该系列更新我的数据框:

visitcounts = visits.to_frame()

我需要让索引成为一列,并且该列具有不同的名称。

visitcounts.rename(columns = {'id': 'visitnum'}, inplace = True) 访问次数['id'] = 访问次数.index

然后,将字段添加回数据框:

pd.merge(df, visitcounts, on=['id'], how='left')

没有任何改变。我做错了什么?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以为此使用pd.Series.value_counts

    df['count'] = df['id'].map(df['id'].value_counts())
    

    结果:

       index   id  name       dob       visit  count
    0      0  111   Joe  1/1/2000    1/1/2018      3
    1      1  111   Joe  1/1/2000    1/5/2018      3
    2      2  122   Bob  1/1/1999    2/8/2018      1
    3      3  133  Jill  1/2/1988    7/9/2017      1
    4      4  111   Joe  1/1/2000  12/31/2018      3
    

    【讨论】:

    • 这成功了!并跳过了我正在采取的许多无关步骤。谢谢!
    • 我可以用这个函数来指望,两个字段吗?说,身份证和访问日期?
    • 你能描述一下你的意思吗?通过两个字段,您的意思是(id,访问)的唯一组合的计数?
    • 感谢jpp的回复。这正是我的意思,独特组合的计数。
    • @EduardoX,您能否单独提出一个问题 - 这样其他用户可以从您的问题 + 答案中受益。
    【解决方案2】:

    jpp 的解决方案可能是更清洁的方法,但为了澄清为什么您的代码不起作用:

    您的问题是您要在visitcounts 中合并的id 实际上是您的索引,而不是名为id 的列:

    >>> visitcounts
         id
    id     
    111   3
    122   1
    133   1
    

    所以,如果你想使用merge,你可以合并visitcounts 的索引和dfid 列,它应该可以工作:

    # First rename column in visitcounts to `count`:
    
    visitcounts.columns=['count']
    
    # Then merge:
    merged_df = pd.merge(df, visitcounts, left_on='id', right_index=True)
    
    >>> merged_df
       index   id  name       dob       visit  count
    0      0  111   Joe  1/1/2000    1/1/2018      3
    1      1  111   Joe  1/1/2000    1/5/2018      3
    4      4  111   Joe  1/1/2000  12/31/2018      3
    2      2  122   Bob  1/1/1999    2/8/2018      1
    3      3  133  Jill  1/2/1988    7/9/2017      1
    

    【讨论】:

    • 太棒了!做到了!非常感谢!
    • 很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2022-01-18
    相关资源
    最近更新 更多