在Pandas中创建一个列,用于计算另一列中唯一值的数量

时间:2018-03-15 22:12:17

标签: python pandas dataframe

我已经尝试了几种方法来实现这一点并且没有任何效果。所以,我将在这里完成整个过程。

我有一个数据框,我试图计算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)    visitscounts [' id'] = visitcounts.index

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

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

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

2 个答案:

答案 0 :(得分:2)

jpp的解决方案可能是更简洁的方法,但为了澄清你的代码无法运作的原因:

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

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

因此,如果您想使用merge,您可以合并visitcounts的索引以及id的{​​{1}}列,它应该有效:< / p>

df

答案 1 :(得分:2)

您可以使用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