我已经尝试了几种方法来实现这一点并且没有任何效果。所以,我将在这里完成整个过程。
我有一个数据框,我试图计算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')
没有任何改变。我做错了什么?
答案 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